更改Flask-Admin视图的响应标头?

时间:2016-07-03 06:33:39

标签: python flask flask-admin

我正在尝试更改我网站上所有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 create_blueprint类的BaseView方法来实现它。这是我的索引视图。

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端点。< / p>

然而,能够注册beforeafter请求函数而不必过多地混淆(比如覆盖特定管理视图的create_blueprint方法)会很高兴或者是那很好吗?

我使用的另一种方法是添加app.after_request_funcs字典。

app.after_request_funcs.setdefault('admin', []).append(my_cache_headers)

在尝试了这些不同的方法之后,我开始认为我最初的做法可能是最好的方法吗?

我的问题基本上是,如何在Flask-Admin视图上设置自定义响应标题?

Flask-Admin GitHub

1 个答案:

答案 0 :(得分:0)

您可以在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