【问题标题】:CORS errors with Flask and geventFlask 和 gevent 的 CORS 错误
【发布时间】:2012-12-01 00:56:37
【问题描述】:

我有一个 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 是这里的问题,但我似乎找不到太多的文档方式......

【问题讨论】:

    标签: javascript python flask cors gevent


    【解决方案1】:

    有一个flask sn -p Decorator for the HTTP Access Control,可以使用@crossdomain(origin='*') 装饰器。

    【讨论】:

    • 您的链接已损坏。
    【解决方案2】:

    最简单的方法是使用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 documentation

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2018-12-22
      • 2012-11-13
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多