【问题标题】:How to check if given variable exist in jinja2 template?如何检查jinja2模板中是否存在给定变量?
【发布时间】:2012-12-19 16:24:57
【问题描述】:

假设我创建了一个模板对象(例如,使用 environment.from_string(template_path))。是否可以检查创建的模板中是否存在给定的变量名称?

我想知道,如果

template.render(x="text for x")

会产生任何影响(如果某些内容实际上会被“x 的文本”替换)。如何检查变量x是否存在?

【问题讨论】:

  • 您要在渲染模板之前还是在模板中检查变量?
  • 渲染前!我需要检查渲染效果是否有意义...
  • 那么你想检查变量x是否真的在模板中被引用了?
  • 这正是我想要的。

标签: python jinja2


【解决方案1】:

来自文档:

定义(值)

如果定义了变量,则返回 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,它将返回一个列表,其中列出了要评估的模板中使用的所有变量。

【讨论】:

  • 不是我的意思——我需要检查模板文本中是否存在{{ variable }} 片段。
【解决方案2】:

我不确定这是否是最好的方法,或者它是否适用于所有情况,但我假设您在字符串中包含模板文本,或者是因为您使用字符串创建了它,或者您的程序已将源模板读入字符串。

我会使用正则表达式库,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

将打印“未使用的变量”

【讨论】:

    【解决方案3】:

    你不能这样做。

    我想你可以解析模板,然后通过 AST 看看是否有引用,但这会是一些复杂的代码。

    【讨论】:

    • 你给我带来了坏消息。您能否为此类解析提供任何建议? Jinja2 可能无论如何都会解析它,我想知道是否有可能获得此过程的效果。
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2017-03-24
    • 2011-07-01
    • 1970-01-01
    • 2012-10-07
    • 2020-05-30
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多