テンプレートオブジェクトを作成したとしましょう(fe using environment.from_string(template_path)
)。作成したテンプレートに与えられた変数名が存在するかどうかを確認することはできますか?
知りたいのですが、
template.render(x="text for x")
何らかの効果があります(何かが実際に「xのテキスト」に置き換えられるかどうかにかかわらず)。変数xが存在するかどうかを確認する方法は?
ドキュメントから:
定義済み(値)
変数が定義されている場合は true を返します。
{% if variable is defined %}
value of variable: {{ variable }}
{% else %}
variable is not defined
{% endif %}
See the default() filter for a simple way to set undefined variables.
編集:値がレンダリングコンテキストに渡されたかどうかを知りたいようです。その場合、 jinja2.meta.find_undeclared_variablesを使用できます。これにより、評価されるテンプレートで使用されるすべての変数のリストが返されます。
これが最善の方法なのか、それともすべての場合に機能するのかはわかりませんが、文字列を使用して作成したか、プログラムが読み取ったため、文字列にテンプレート テキストがあると仮定しますソース テンプレートを文字列に変換します。
正規表現ライブラリ re を使用します
>>> import re
>>> template = "{% block body %} This is x.foo: {{ x.foo }} {% endblock %}"
>>> expr = "\{\{.*x.*\}\}"
>>> result = re.search(expr, template)
>>> try:
>>> print result.group(0)
>>> except IndexError:
>>> print "Variable not used"
結果は次のようになります。
'{{ x.foo }}'
または、キャッチした例外をスローします。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
「変数は使用されていません」と出力されます
そんなことはできません。
テンプレートを解析してから AST を調べて参照があるかどうかを確認できると思いますが、それはやや複雑なコードになります。