2012-12-01 81 views
6

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

最初,我尝试添加限制最少的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 

CORS似乎当请求的Content-Type首部设置为应用/ JSON(所要求的API)失败,所以一个快速破解得到的东西工作:

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

但是,除POST之外的所有东西仍然失败。此外,gevent的日志记录功能已打开,但没有记录OPTIONS请求(我相信它是CORS预检内容),即使浏览器显示它们出现故障时也是501.

我是否需要更改gevent中的某些内容或烧瓶让CORS工作?

编辑:使用内置瓶服务器的工作原理,所以GEVENT是这里的问题,但我似乎无法找到文档的方式多...

回答

0

最简单的方法是使用烧瓶-CORS插件

安装使用PIP

PIP安装-U烧瓶-CORS

示例代码

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

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

对于文档h来说这里flask-cors documentation