如何对每个Flask视图应用装饰器

4 投票
2 回答
2178 浏览
提问于 2025-04-18 03:08

我有一个装饰器(叫做 deco),我想把它应用到我Flask应用里的每一个视图上,这样可以修改响应头,避免IE的兼容模式(通过 res.headers.add("X-UA-Compatible", "IE=Edge" 来实现)。我使用的方式是:

@app.route('/')
@deco
def index():
    return 'Hello world'

我现在是用 Flask 的一个子类来创建这个应用(这样可以修改jinja的行为)。

class CustomFlask(Flask):
    jinja_options = ...

app = CustomFlask(__name__, ...)

有没有办法让我修改 CustomFlask,让 deco 装饰器应用到所有的响应上呢?

2 个回答

1

你可以考虑自己写一个定制的 WSGI 中间件。这样你就可以获取到你应用的所有响应,并根据需要修改响应头。快速入门 里讲了怎么接入中间件,而且网上有很多关于 WSGI 的教程,教你如何在 start_response 中添加响应头。

6

要在每个发出的响应中添加头部信息,可以使用@Flask.after_request钩子来实现。

@app.after_request
def add_ua_compat(response):
    response.headers['X-UA-Compatible'] = 'IE=Edge'
    return response

还有一个Flask扩展,它可以完全做到这一点;只需注册这个钩子并添加一个头部信息。

撰写回答