【问题标题】:Flask Access-Control-Allow-Origin for multiple URLsFlask Access-Control-Allow-Origin 用于多个 URL
【发布时间】:2019-01-23 10:42:51
【问题描述】:

我有一个用 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。在 cmets 中有一个建议:h.extend([("Access-Control-Allow-Origin", orig) for orig in origin]) 但它仍然不起作用。

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

【问题讨论】:

    标签: python flask cors


    【解决方案1】:

    这是在本地使用同一前端项目的多个实例同时访问本地 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
    

    【讨论】:

    • 我通过执行以下response.headers["Access-Control-Allow-Origin"] = request.environ.get('HTTP_ORIGIN') 来允许 Access-Control-Allow-Origin,但是,在某些浏览器中根本不发送原始标头。我是否需要先检查“来源”是否存在,如果不存在则检查“推荐人”还是推荐人总是在那里?
    • 试试pip install flask-cors。它具有这些功能以及更多功能。 flask-cors.readthedocs.io/en/latest
    【解决方案2】:

    简单的例子,试试吧!
    我希望它会帮助你。 您需要为“Access-Control-Allow-Origin”编辑 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
    

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2018-07-18
      • 2017-07-31
      • 2017-06-15
      • 2020-01-05
      • 2016-09-30
      • 2015-06-17
      • 2019-06-19
      • 2017-12-29
      相关资源
      最近更新 更多