[英]Altering the response headers of Flask-Admin views?
我正在尝试更改网站上所有Flask-Admin视图的响应标头。 具体来说,我想设置缓存头。
对于正常的蓝图,它非常简单:
@my_blueprint.after_request
def add_my_headers(response):
h = {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
response.headers.extend(h)
return response
这将起作用。
但是对于Flask-Admin视图,我一直在做类似的事情:
@app.after_request
def add_my_headers(response):
if request.endpoint[:5] == 'admin':
h = {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
response.headers.extend(h)
return response
return response
这很好用,但似乎很杂乱。
由于某种原因,Flask-Admin似乎没有提供在将蓝图注册到主应用程序之前注册after_request
函数的方法。
我能够通过重写Flask-Admin BaseView
类的create_blueprint
方法来使其工作。 这是我的索引视图。
class MyIndexView(AdminIndexView):
def create_blueprint(self, admin):
"""
Create Flask blueprint.
"""
self.blueprint = super(AdminIndexView, self).create_blueprint(admin)
def my_cache_headers(response):
h = {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
response.headers.extend(h)
return response
self.blueprint.after_request(my_cache_headers)
return self.blueprint
@expose('/')
def index(self):
return self.render('admin/index.html')
这样就可以了。 我想问题是我希望这些标头应用于我的所有/admin/
视图,因此也许最好的方法是使用@app.after_request
装饰器,然后仅检查/admin
端点。
但是,能够after
请求功能before
或after
进行注册而不必花太多时间(例如,为特定的管理员视图覆盖create_blueprint
方法)会很好,这很好吗?
我使用的另一种方法是添加到app.after_request_funcs
字典。
app.after_request_funcs.setdefault('admin', []).append(my_cache_headers)
在尝试了这些不同的方法之后,我开始认为我的原始方法可能是最好的方法?
我的问题本质上是, 如何在Flask-Admin视图上设置自定义响应头?
您可以在BaseView中更改方法render()以添加所需的任何标题:
from flask_admin.base import BaseView
from flask_admin import babel
from flask import current_app, render_template, make_response
from flask_admin import helpers as h
def render(self, template, **kwargs):
kwargs['admin_view'] = self
kwargs['admin_base_template'] = self.admin.base_template
kwargs['_gettext'] = babel.gettext
kwargs['_ngettext'] = babel.ngettext
kwargs['h'] = h
kwargs['get_url'] = self.get_url
kwargs['config'] = current_app.config
kwargs.update(self._template_args)
response = make_response(render_template(template, **kwargs), 200)
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
response.headers['Pragma'] = 'no-cache'
response.headers['Expires'] = '0'
return response
BaseView.render = render
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.