使用Angular:PUT,OPTIONS方法的Flask RESTful跨域问题

b.b*_*.b. 38 python cors flask angularjs flask-restful

我已经开发了一个带有Flask Restful的小型只写REST api,它接受来自少数可能具有更改IP地址的客户端的PUT请求.我的客户是运行AngularJS前端的嵌入式Chromium客户端; 他们使用简单的魔法密钥对我的API进行身份验证 - 这对我的规模非常有限.

我正在测试现在部署我的API,我注意到Angular客户端正在尝试向我的Flask服务发送OPTIONS http方法.我的API同时回复了404(因为我还没有编写OPTIONS处理程序,只有PUT处理程序).似乎在发送非POST或GET的跨域请求时,Angular将在服务器上发送一个pre-flight OPTIONS方法,以确保在发送实际请求之前接受跨域请求.是对的吗?

无论如何,我如何允许所有跨域PUT请求到Flask Restful API?我之前使用了带有(非宁静的)Flask实例的cross-domaion装饰器,但是我是否需要在我的API中编写OPTIONS处理程序?

Mat*_*dic 51

使用Flask-CORS模块,您可以在不更改代码的情况下执行跨域请求.

from flask.ext.cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
Run Code Online (Sandbox Code Playgroud)

更新

正如Eric建议的那样,该flask.ext.cors模块现已弃用,您应该使用以下代码:

from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 !完美的工作. (3认同)
  • 这是部分答案,直到我添加@app.after_request /sf/ask/1661895371/?noredirect= 1&lq=1 (2认同)

Joh*_*enn 20

您可以使用after_request钩子:

@app.after_request
def after_request(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
    response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
    return response

查看本教程以获取更多详细信息 - http://tutsbucket.com/tutorials/building-a-blog-using-flask-and-angularjs-part-1/


b.b*_*.b. 18

我通过重写我的Flask后端解决了这个问题,在我的PUT响应中回答了一个Access-Control-Allow-Origin标头.此外,我在Flask应用程序中创建了一个OPTIONS处理程序,通过遵循我在http RFC中读到的内容来回答options方法.

PUT方法的返回如下所示:

return restful.request.form, 201, {'Access-Control-Allow-Origin': '*'} 
Run Code Online (Sandbox Code Playgroud)

我的OPTIONS方法处理程序如下所示:

def options (self):
    return {'Allow' : 'PUT' }, 200, \
    { 'Access-Control-Allow-Origin': '*', \
      'Access-Control-Allow-Methods' : 'PUT,GET' }
Run Code Online (Sandbox Code Playgroud)

@tbicr是对的:Flask会自动为你回答OPTIONS方法.但是,在我的情况下,它没有传输具有该答案的Access-Control-Allow-Origin标头,因此我的浏览器从api获得了回复,这似乎意味着不允许跨域请求.我在我的情况下重载了选项请求,并添加了ACAO标题,浏览器似乎对此感到满意,并使用PUT跟进了OPTIONS.


Seb*_*NCA 9

这个解决方法如何:

from flask import Flask
from flask.ext import restful
from flask.ext.restful import Api
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config')

#flask-sqlalchemy
db = SQLAlchemy(app)

#flask-restful
api = restful.Api(app)

@app.after_request

def after_request(response):
  response.headers.add('Access-Control-Allow-Origin', '*')
  response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
  return response

import views
Run Code Online (Sandbox Code Playgroud)

我从教程中获取了这个。效果很好。实际上,我认为这是迄今为止我见过的最好的方法。

{'Access-Control-Allow-Origin': '*'}在每个端点上返回似乎效率不高,因为您必须在每个端点上添加它。有点烦人……至少对我来说是这样。

我试过了,@cors.crossdomain(origin='*')但看起来它只适用于GET请求。


tbi*_*icr 5

你是对的,OPTIONS每次在浏览器中发出实际请求之前都会调用该方法。OPTIONS响应有允许的方法和标头。Flask 自动处理OPTIONS请求。

要获得跨域请求的访问权限,您的 API 必须具有Access-Control-Allow-Origin标头。它可以包含特定域,但如果您想允许来自任何域的请求,您可以将其设置为Access-Control-Allow-Origin: *.

要设置 CORS,flask您可以查看一个扩展代码或尝试使用此扩展: https: //github.com/wcdolphin/flask-cors/blob/master/flask_cors.py

要设置 CORS 来flask-restful查看此拉取请求:https://github.com/twilio/flask-restful/pull/122https://github.com/twilio/flask-restful/pull/131。但貌似flask-restful默认还不支持。


小智 5

只是对此评论的更新。Flask CORS 是可行的方法,但不推荐使用 flask.ext.cors。

用: from flask_cors import CORS