我有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
的结果吗?
答案 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
,则必须小心不要意外地将内容转义两次。