web-dev-qa-db-ja.com

FlaskデコレータからJinjaテンプレートに変数を送信するにはどうすればよいですか?

私の設計図の周りの多くのルートflaskアプリは 'サイドバーデータ'をjinjaに送信する必要があります。

これを行う最も効率的な方法を探しています。彼らは私の「generate_sidebar_data()」関数をすべての青写真にインポートするよりも優れたものでなければなりません。

var1, var2, var3 = generate_sidebar_data()

そして、それらを「render_template」で送信します。

return render_template('template.html',
                           var1=var1,
                           var2=var2,
                           var3=var3
                      )

私が欲しいのは、上記と同じことをするルートで置くことができるデコレーターです(関数を実行し、変数をjinjaに送信します)が、これが可能かどうかはわかりません。デコレータ関数内からどのようにして変数をjinjaに送信しますか?

@blueprint.route('/')
@include_sidebar_data
def frontpage():

    return render_template('template.html')
32
chrickso

デコレータやテンプレートメソッドなどを使用するよりも簡単なものを提案します。

def render_sidebar_template(tmpl_name, **kwargs):
    (var1, var2, var3) = generate_sidebar_data()
    return render_template(tmpl_name, var1=var1, var2=var2, var3=var3, **kwargs)

うん、機能だけ。本当に必要なのはそれだけですよね? this Flaskインスピレーションのためのスニペット。異なるコンテキストで本質的にまったく同じ種類のことをしています。

24
wheaties

コンテキストプロセッサを使用できます( http://flask.pocoo.org/docs/api/#flask.Flask.context_processor ):

def include_sidebar_data(fn):
    @blueprint.context_processor
    def additional_context():
        # this code work if endpoint equals to view function name
        if request.endpoint != fn.__name__:
            return {} 
        var1, var2, var3 = generate_sidebar_data()
        return {
            'var1': var1,
            'var2': var2,
            'var3': var3,
        }
    return fn


@blueprint.route('/')
@include_sidebar_data
def frontpage():
    return render_template('template.html')

UPD:次の例がより好きで、デコレータをいくつかのビュー関数に使用する方が良い:

sidebar_data_views = []


def include_sidebar_data(fn):
    sidebar_data_views.append(fn.__name__)
    return fn


@blueprint.context_processor
def additional_context():
    # this code work if endpoint equals to view function name
    if request.endpoint not in sidebar_data_views:
        return {} 
    var1, var2, var3 = generate_sidebar_data()
    return {
        'var1': var1,
        'var2': var2,
        'var3': var3,
    }


@blueprint.route('/')
@include_sidebar_data
def frontpage():
    return render_template('template.html')
11
tbicr

次のようなデコレータ関数を作成できます。

def include_sidebar_data(fn):
    template_name = fn()
    var1, var2, var3 = generate_sidebar_data()
    def wrapped():
        return render_template(template_name, var1=var2, var2=var2)
    return wrapped

@blueprint.route('/')
@include_sidebar_data
def frontpage():

    return 'template.html'
4
janos