如何对每个Flask视图应用装饰器
我有一个装饰器(叫做 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扩展,它可以完全做到这一点;只需注册这个钩子并添加一个头部信息。