首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶-CORS不适用于WSGI中间件返回的响应。

烧瓶-CORS不适用于WSGI中间件返回的响应。
EN

Stack Overflow用户
提问于 2021-10-13 19:09:36
回答 1查看 261关注 0票数 0

我有一个使用Flask-CORS的Flask应用程序,以及一个WSGI中间件,它为某些路由返回一个自定义响应,而不是Flask应用程序。对于中间件返回的响应,没有应用Flask-CORS,所以我不得不手动将CORS头应用到响应中。

代码语言:javascript
复制
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)

我试着扭转中间件和烧杯应用的顺序,但这并没有改变它。

代码语言:javascript
复制
app = Flask(__name__)
CORS(app)
app.wsgi_app = Middleware(app)

我不想重复酒瓶的作用。如何将烧瓶-CORS应用于来自中间件的响应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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函数可以返回响应(或中止)以提前结束视图处理,然后转到响应处理。

代码语言:javascript
复制
from flask import request, Response

@app.before_request
def some_users_403():
    if request.path == "/foo":
        return Response("...", status=403)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69561068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档