多个URL的Flask Access-Control-Allow-Origin

时间:2017-03-08 20:28:00

标签: python flask cors

我有一个用python / flask编写的API,我想只允许几个URL访问这个API。 JavaScript调用是简单的jQuery,如:

    $.ajax({
     url: "http://myApi.com/api/doit",  
     dataType:'JSON',
     success:function(data){
       console.log("DEBUG: yeeeeaaaahhh!");
     },
     error:function(xhr){
       console.log("Error occured! status: " + xhr.status + ", text: " + xhr.statusText);
     }
  });

这里的大多数解决方案都非常令人失望,总是提供设置Access-Control-Allow-Origin : '*'或启动chrome禁用检查。当然它有效,但这不是目的。 w3上的规范说分号列表应该有效,但事实并非如此。逗号分隔列表也失败了。 从烧瓶本身有http://flask.pocoo.org/snippets/56/但它不适用于多个URL。在评论中有一个建议:h.extend([("Access-Control-Allow-Origin", orig) for orig in origin])但它仍然不起作用。

我唯一的解决方案是检查代码的来源,如果它在我的白名单中,则放入标题Access-Control-Allow-Origin : '*'。这是一种解决方法,但我不太喜欢它。你能建议一个更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:3)

这是典型的情况,当本地使用同一个前端项目的多个实例一起访问本地Flask服务器时,以及当通配符" *"不允许,因为您允许凭据(即使用JWT身份验证)。

我的方法 - 在开发中 - 是使用after_request装饰器和Flask的请求上下文。

创建域名白名单:

white = ['http://localhost:8080','http://localhost:9000']

现在使用after_request装饰器拦截所有传入的请求,检查引荐来源是否在白名单中,如果是,则注入response.headers以允许访问原点。例如:

from flask import request

@app.after_request
def add_cors_headers(response):
    r = request.referrer[:-1]
    if r in white:
        response.headers.add('Access-Control-Allow-Origin', r)
        response.headers.add('Access-Control-Allow-Credentials', 'true')
        response.headers.add('Access-Control-Allow-Headers', 'Content-Type')
        response.headers.add('Access-Control-Allow-Headers', 'Cache-Control')
        response.headers.add('Access-Control-Allow-Headers', 'X-Requested-With')
        response.headers.add('Access-Control-Allow-Headers', 'Authorization')
        response.headers.add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE')
    return response

答案 1 :(得分:0)

简单的例子,尝试一下!
希望对您有帮助。 您需要为“访问控制允许来源”编辑white_origin。

app_name.py(Flask的Python文件)

from flask import request

@app.after_request
def after_request(response):
    white_origin= ['http://www.dom.com:8000','http://localhost']
    if request.headers['Origin'] in white_origin:
        response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] 
        response.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'
        response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization'
    return response