簡體   English   中英

更改Flask-Admin視圖的響應標頭?

[英]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請求功能beforeafter進行注冊而不必花太多時間(例如,為特定的管理員視圖覆蓋create_blueprint方法)會很好,這很好嗎?

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

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

在嘗試了這些不同的方法之后,我開始認為我的原始方法可能是最好的方法?

我的問題本質上是, 如何在Flask-Admin視圖上設置自定義響應頭?

Flask-Admin GitHub

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM