假设,我创建了一个模板对象(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,它将返回您要评估的模板中使用的所有变量的列表。
我不确定这是否是最好的方法,或者它是否适用于所有情况,但我假设您在字符串中有模板文本,或者是因为您使用字符串创建了它,或者您的程序已读取源模板转换为字符串。
我会使用正则表达式库,重新
>>> 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 来查看是否有引用,但这将是一些复杂的代码。