次のように Jinja2 テンプレートを返す場合:
return render_response('home.htm', **context)
テンプレート内からコンテキスト内の変数のリストを取得するにはどうすればよいでしょうか?
技術的には、コンテキストは名前付き辞書として渡されないため、テンプレート内からコンテキスト変数のリストを生成するには少し作業が必要です。でも可能です。
基本的にグローバル変数/関数の辞書である jinja2.Context オブジェクトを返すように、 Jinja コンテキスト関数を定義します。
その関数をグローバル名前空間で使用できるようにします。つまり、jinja2.Environment または jinja2.Template グローバル ディクショナリ
オプションで、コンテキストからオブジェクトをフィルタリングします。たとえば、callable()
Jinja のデフォルトのグローバル ヘルパー関数 (range、joiner など) をスキップするために使用します。これは、コンテキスト関数またはテンプレートで行うことができます。それが最も理にかなっているところ。
例:
>>> import jinja2
>>>
>>> @jinja2.contextfunction
... def get_context(c):
... return c
...
>>> tmpl = """
... {% for key, value in context().items() %}
... {% if not callable(value) %}
... {{ key }}:{{ value }}
... {% endif %}
... {% endfor %}
... """
>>>
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>>
>>> print(template.render(**context))
a:1
c:3
b:2
render_response
[または、 withを呼び出して('home.htm', context=context)
、他のソリューションを機能させます。]
@crewbumの回答をFlaskアプリから取得する方法は次のとおりです。
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable