【问题标题】:Jinja2 escape the filter operator ("|")Jinja2 转义过滤运算符(“|”)
【发布时间】:2015-01-07 06:57:57
【问题描述】:

在jinja2中,运算符|用作过滤,如{{ user_input | safe }}。但是,| 也是一个有效的 python 运算符,比如按位或、设置联合等。假设我在模板中有以下代码

{% for elem in (set1 | set2) %} elem.render_some_string() {% endfor %}

Jinja 抛出异常

File "some_template_file.txt", line xxx, in template
    {% for elem in (set1 | set2) %} elem.render_some_string() {% endfor %}
jinja2.exceptions.TemplateAssertionError: no filter named 'set2'

这是可以理解的。但是有没有办法解决这个问题,比如告诉 jinja 不要将 | 运算符解释为过滤器?我希望有一个比“用set1.union(set2) 替换(set1 | set2)”更好的解决方案——除非这是唯一可能的解决方案(或唯一推荐的解决方案)。

【问题讨论】:

  • 据我所知,建议的解决方案是可行的方法。但很高兴知道是否有办法覆盖事物。

标签: python jinja2


【解决方案1】:

您不能在 Jinja2 表达式中使用 | 来操作 Jinja2 过滤器操作以外的任何操作。 每个使用{%%}{{}}(等等)的语句都不是真正的python。它是一种 Jinja 语言,由 Jinja 进行词法分析、解析和执行。您放置的每一段代码都没有像您可能的那样“评估”,但即使是 + 在 Jinja2 (github-Jinja2/parser.py#L450) 的解析器模块中也被解析和执行。因此|是Jinja语法的一个记号,不能反转为它的python含义。

你可以调用你的方法的原因是你的对象仍然是真实的,它们保留了所有的能力。您建议使用.union 的解决方案是您唯一可用的解决方案。

仅供参考:Jinja2 中没有开放(或封闭)的问题允许这种可能性(如果我认为这样做可能会被拒绝)

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2012-06-07
    • 2011-06-21
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多