我有一个使用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)我试着扭转中间件和烧杯应用的顺序,但这并没有改变它。
app = Flask(__name__)
CORS(app)
app.wsgi_app = Middleware(app)我不想重复酒瓶的作用。如何将烧瓶-CORS应用于来自中间件的响应?
发布于 2021-10-14 00:16:51
烧瓶-CORS是一个酒瓶扩展。它在Flask应用程序层工作,也就是说,它对到达Flask应用程序的请求进行操作。应用于应用程序的中间件发生在Flask应用程序周围,即Flask扩展所看到的上面的层。您注册扩展的顺序与应用中间件无关,它们位于WSGI调用堆栈的不同层。
当请求传入时,您的中间件决定尽早返回响应,并且从不调用它封装的Flask应用程序,因此没有执行任何有关Flask应用程序的操作,包括对它的Flask-CORS扩展。您不能将烧瓶-CORS应用于中间件响应,因为它不能在同一层工作。
如果您需要中间件返回的响应中的CORS头,则需要执行您所做的操作并自行设置它们。如果您想避免这种数量的重复,您需要在Flask中完成所有的操作,或者编写一个中间件来围绕其他中间件来执行CORS操作,而不是使用Flask扩展。
若要在Flask堆栈中写入与您的中间件相当的内容,因此使用before_request即可使Flask扩展影响您生成的响应。before_request函数可以返回响应(或中止)以提前结束视图处理,然后转到响应处理。
from flask import request, Response
@app.before_request
def some_users_403():
if request.path == "/foo":
return Response("...", status=403)https://stackoverflow.com/questions/69561068
复制相似问题