如何在Jinja2中执行无返回自定义过滤器且不赋值变量?
在Jinja2中调用无返回值自定义过滤器(无需变量赋值)
正确写法
使用Jinja2的do标签可以直接执行表达式而不输出结果,也不需要赋值给变量:
{%- do {'one': 'aaa', "two": "bbb", 'three': 'ccc'} | get_env_var -%}
为什么之前的写法报错?
- 第一种写法
{%- {'one': ...} | get_env_var -%}:{% ... %}是标签语法块,内部必须是合法的标签名称(如set、if),不能直接写表达式,因此触发tag name expected错误。 - 第二种写法
{{'one': ...} | get_env_var}:字典定义缺少外层大括号,正确的字典写法是{{{'key': 'val'}}};但即使修正,{{ ... }}是用来输出表达式结果的,你的过滤器无返回值会输出None,若在YAML环境(如Ansible)中,输出内容会被解析为YAML文档,导致后续内容冲突,也就是第三种写法触发的yaml.composer.ComposerError错误。
注意事项
do标签需要Jinja2启用jinja2.ext.do扩展:
- 如果是手动创建Jinja2环境,需在配置中添加:
from jinja2 import Environment, DictLoader env = Environment(extensions=['jinja2.ext.do'], loader=DictLoader({})) - 若是在Ansible等基于Jinja2的工具中,该扩展默认已启用,无需额外配置。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

