6

我有一个正在运行的 API,使用 Flask、Flask-SQLAlchemy 和 Flask-Restless,并且正在尝试从 javascript(确切地说是 backbone.js)发出 POST/PUT/DELETE 请求。但是,我一直遇到 CORS 错误——除了 GET 之外的所有内容都会在浏览器中返回 HTTP OPTIONS 501 Not Implemented Error。

最初,我尝试向所有响应中添加限制最少的 CORS 标头:

@app.after_request
def after(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Methods',
                         'POST, GET, PUT, PATCH, DELETE, OPTIONS')
    response.headers.add('Access-Control-Allow-Headers',
                         'Content-Type, X-Requested-With')
    response.headers.add('Access-Control-Max-Age', '1728000')

    return response

当请求的 Content-Type 标头设置为 application/json (根据 API 的要求)时,CORS 似乎失败了,因此进行了快速破解以使事情正常进行:

@app.before_request
def before():
    request.environ['CONTENT_TYPE'] = 'application/json'

但是,除了 POST 之外的所有内容仍然失败。此外,gevent 的日志记录已打开,但没有记录任何 OPTIONS 请求(我相信这是 CORS 预检内容),即使浏览器显示它们以 501 失败也是如此。

我是否需要更改 gevent 或 Flask 中的某些内容才能使 CORS 正常工作?

编辑: 使用内置的 Flask 服务器运行 API 是可行的,所以 gevent 是这里的问题,但我似乎找不到太多的文档方式......

4

2 回答 2

7

HTTP 访问控制有一个烧瓶片段装饰器,您可以使用 @crossdomain(origin='*') 装饰器。

于 2012-12-11T04:20:14.553 回答
0

最简单的方法是使用flask-cors插件

使用 pip 安装

pip install -U flask-cors

示例代码

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route("/api/v1/users")
def list_users():
  return "user example"

有关文档,请点击此处flask-cors 文档

于 2016-08-27T05:44:57.380 回答