我已经开发了一个小型的只写的REST api,它可以接受少数几个可能会改变IP地址的客户端的PUT请求。我的客户端是运行AngularJS前端的嵌入式Chromium客户端;他们使用我的API使用一个简单的神奇密钥进行身份验证--对于我非常有限的规模来说,这就足够了。
我正在测试如何部署我的API,并且我注意到这些角度的客户端正在尝试向我的Flask服务发送一个选项http方法。同时,我的API使用了404 (因为我还没有编写选项处理程序,只有PUT处理程序)。似乎在发送非POST或GET的跨域请求时,角将在服务器上发送一种飞行前选项方法,以确保在发送实际请求之前跨域请求被接受。是那么回事吗?
无论如何,我如何允许所有跨域的PUT请求到?我以前使用过带有(非restful) Flask实例的跨域装饰器,但是否需要将选项处理程序也写入我的API?
发布于 2013-11-14 15:24:16
我解决了这个问题,在我的PUT响应中重写了我的烧瓶后端,以一个访问控制允许起始头来回答这个问题。此外,我在我的Flask应用程序中创建了一个选项处理程序,通过遵循我在http中看到的内容来回答OPTIONS方法。
PUT方法的返回如下所示:
return restful.request.form, 201, {'Access-Control-Allow-Origin': '*'} 我的OPTIONS方法处理程序如下所示:
def options (self):
return {'Allow' : 'PUT' }, 200, \
{ 'Access-Control-Allow-Origin': '*', \
'Access-Control-Allow-Methods' : 'PUT,GET' }@tbicr是对的:烧瓶会自动为您回答选项方法。然而,在我的例子中,它并没有发送带有这个答案的访问控制-允许-原产地报头,所以我的浏览器得到了api的答复,这似乎意味着不允许跨域请求。在我的情况下,我重载了选项请求,并添加了ACAO头,浏览器似乎对此感到满意,并在选项之后添加了一个PUT。
发布于 2014-12-11 13:23:16
发布于 2016-06-09 19:34:11
这个解决办法怎么样:
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我从这教程中学到了这个。效果很好。事实上,我认为这是我见过的最好的方法。
在每个端点上返回{'Access-Control-Allow-Origin': '*'}似乎并不有效,因为您必须在每个端点上添加它。有点沾沾自喜.至少对我来说。
我尝试过@cors.crossdomain(origin='*'),但是看起来它只适用于GET请求。
https://stackoverflow.com/questions/19962699
复制相似问题