2016-07-03 11 views
0

自分のサイトのすべての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 

そして、これは動作します:

は、通常の青写真のために、それは非常に簡単です。

しかし、私はのようなものをやっているフラスコ-管理ビューのための:これはうまく動作しますが、それはそれを行うにはかなり厄介な方法だ

@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エンドポイントを確認するのが最善の方法です。

しかし、(特定の管理ビューのcreate_blueprintメソッドをオーバーライドするように)あまり周りに混乱することなく、beforeまたはafter要求機能を登録できるようにするにはいいだろうそれとも細かいことですか?

私が使用した別の方法は、app.after_request_funcs dictに追加することです。

これらの異なる方法を試した後、私は自分のオリジナルのやり方が最良の方法かもしれないと考え始めていますか?

私の質問は基本的にFlask-Adminビューでカスタム応答ヘッダーを設定するにはどうすればよいですか?

Flask-Admin GitHub

答えて

0

あなたが好きなヘッダを追加するBaseViewに()メソッドは、レンダリング変更することができます:

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 
関連する問題