【问题标题】:Flask-CORS does not apply to responses returned by WSGI middlewareFlask-CORS 不适用于 WSGI 中间件返回的响应
【发布时间】:2021-12-02 06:17:35
【问题描述】:

我有一个使用 Flask-CORS 的 Flask 应用程序,以及一个 WSGI 中间件,它返回自定义响应而不是某些路由的 Flask 应用程序。对于中间件返回的响应,Flask-CORS 未应用,因此我必须手动将 CORS 标头应用于该响应。

class Middleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        request = Request(environ)

        if request.path == "/foo":
            res = Response("...", mimetype="application/json", status=403)
            # flask-cors is not applied, so I set headers manually
            res.access_control_allow_credentials = True
            res.access_control_allow_origin = "*"
            res.access_control_allow_methods = ["GET", "PUT", "DELETE", "PATCH", "OPTIONS", "POST", "HEAD"]
            return res(environ, start_response)

        return self.app(environ, start_response)  # flask-cors works here

app = Flask(__name__)
app.wsgi_app = Middleware(app)
CORS(app)

我尝试颠倒应用中间件和 Flask-CORS 的顺序,但这并没有改变它。

app = Flask(__name__)
CORS(app)
app.wsgi_app = Middleware(app)

我不想重复 Flask-CORS 所做的事情。如何将 Flask-CORS 应用于来自中间件的响应?

【问题讨论】:

    标签: python flask wsgi flask-cors


    【解决方案1】:

    Flask-CORS 是一个 Flask 扩展。它在 Flask 应用程序层工作,即它对到达 Flask 应用程序的请求进行操作。应用于应用程序的中间件发生在围绕 Flask 应用程序,即 Flask 扩展所看到的层之上。注册扩展与应用中间件的顺序与此无关,它们位于 WSGI 调用堆栈的不同层。

    当请求进入时,您的中间件决定提前返回响应,并且从不调用它所包装的 Flask 应用程序,因此 Flask 应用程序不会执行任何操作,包括其上的 Flask-CORS 扩展。您不能将 Flask-CORS 应用于中间件响应,因为它不在同一层工作。

    如果您的中间件返回的响应中需要 CORS 标头,您需要执行您所做的操作并自行设置它们。如果你想避免这种数量的重复,你需要在 Flask 中做所有事情,或者编写一个中间件来围绕这个其他中间件而不是 Flask-CORS 扩展来执行 CORS。

    要在 Flask 堆栈中编写等效的中间件,以便 Flask-CORS 扩展影响您生成的响应,请使用 before_requestbefore_request 函数可以返回响应(或中止)以提前结束视图处理并继续进行响应处理。

    from flask import request, Response
    
    @app.before_request
    def some_users_403():
        if request.path == "/foo":
            return Response("...", status=403)
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2017-01-25
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-03-04
      • 2020-06-17
      • 2015-08-15
      • 1970-01-01
      相关资源
      最近更新 更多