5

ヘッダーを含むベース テンプレートがあり、そのヘッダーのコンテンツをテンプレートに渡す必要があるとします。

<header>
  You are logged in as {{ name }}
</header>

この基本テンプレートは、多くのページで拡張されます。個々の子に渡さずにその変数を渡すにはどうすればよいですか? たとえば、これを行う必要はありません。

render_template("child1.html", name=user.name)
render_template("child2.html", name=user.name)
render_template("child3.html", name=user.name)
etc...

子ページがいくつあるかは誰にもわからないからです。ドライ感が足りない。

基本テンプレートを実際にレンダリングすることはなく、その子のみをレンダリングしますが、他にデータを渡す方法がわかりません。

これを行う方法はありますか?継承を使用しないでください。

4

2 に答える 2

2

Flask のcontext-processorsを使用する必要があります。

@app.context_processor
def inject_user():
    return dict(user=g.user)

この同様のSO の質問と回答を参照してください。

私がそれをどのように使用しているかの例(単にアプリの構成設定を挿入するため):

@app.context_processor
def lib_versions():
    return dict(
        bokehversion = app.config['BOKEH_VERSION'],
        jqueryversion = app.config['JQUERY_VERSION'],
        jqueryuiversion = app.config['JQUERYUI_VERSION'],
        bootstrapversion = app.config['BOOTSTRAP_VERSION'],
    )

私のFlask設定ファイルから引き出されたもの:

class Config(object):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI = ''
    TMP_DIR = ''
    STATIC_FOLDER = ''
    BOKEH_VERSION = '0.8.2'
    JQUERY_VERSION = '1.11.2'
    JQUERYUI_VERSION = '1.11.4'
    BOOTSTRAP_VERSION = '3.3.4'

class ProductionConfig(Config):
    DEBUG = False
    TESTING = False

次に、他の Jinja2 変数と同様に、ベース テンプレートでこれらを呼び出します。

<!-- START: CSS -->
<link rel="stylesheet" media="screen" type="text/css" href="http://cdn.bokeh.org/bokeh/release/bokeh-{{ bokehversion }}.min.css">
<!-- END: CSS -->
<!-- START: JS -->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/{{ jqueryversion }}/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/{{ jqueryuiversion }}/jquery-ui.min.js"></script>
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/{{ bootstrapversion }}/js/bootstrap.min.js"></script>
<!-- END: JS -->
于 2015-04-30T22:37:17.660 に答える