32

設計図を作成したフラスコ アプリの周りの多くのルートでは、「サイドバー データ」を jinja に送信する必要があります。

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

var1, var2, var3 = generate_sidebar_data()

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

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

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

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

    return render_template('template.html')
4

3 に答える 3

12

コンテキスト プロセッサ ( 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')
于 2013-04-07T07:54:57.347 に答える
4

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

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'
于 2013-04-07T05:30:23.210 に答える