在jinja获得更深入的评价

时间:2016-12-25 17:29:34

标签: python jinja2

我有jinja的python函数,它重新包含一个包含jinja指令的字符串,如下所示:

def test():
    # stuff ...
    return "The value of x is {{x}}"

我将此功能设置为jinja的全局上下文,现在我想使用它:

{% set x = 3 %}
{{ test() }}

不幸的是,没有评估“test”的返回值,因此结果是:

The value of x is {{x}}

我可以以某种方式强制评估test的结果吗?

1 个答案:

答案 0 :(得分:3)

您最好使用jinja2 macro。在这种情况下,您可能会将x传递给宏:

{% macro test(x) -%}
The value of x is {{x}}
{%- endmacro %}

{% set x = 3 %}
{{ test(x) }}

请注意,我已将x传递给宏 - 确实没有理由不通过x,这会让事情变得更加清晰。另外,我甚至不确定如何让它隐含地传递全局变量; - )。

另一种策略(由于降低清晰度和增加搞乱内容的风险,我不推荐)将在您的回调函数中呈现模板:

from jinja2 import Template
def test(x):
    return Template('The value of x is {{x}}').render(x=x)

此处我仍然将x传递给模板的上下文。 AFAIK,模板无法获取函数中的全局上下文(实际上,这会导致非常混乱的代码)。如果您确实在test功能中渲染了模板,那么如果您使用autoescape=True,则必须小心不要意外地将内容转义两次。