Jinja2模板渲染时变量键名未替换为对应值的问题咨询
问题成因
- 模板中通过join拼接得到的
line变量只是字符串类型的键名,Jinja2没有自动将字符串作为变量名去上下文检索取值的逻辑,直接输出{{ line }}只会打印字符串本身,不会读取该键对应的配置值。 - 原Python代码直接将kvdata字典的键值对作为顶层变量传入模板,没有提供显式的字典结构供按键名取值。
- 额外说明:原代码中使用
yaml.load未指定Loader,存在安全风险且运行时会抛出警告。
修复方案
推荐优先使用「显式传配置字典」的方案,可维护性更高:
步骤1:修改Python渲染代码
#!/usr/bin/env python3 from jinja2 import Environment, FileSystemLoader import yaml # 指定SafeLoader避免反序列化安全问题 kvdata = yaml.load(open('test.yml'), Loader=yaml.SafeLoader) env = Environment(loader = FileSystemLoader('')) template = env.get_template('test.j2') # 将整个配置字典作为config参数传入,避免顶层变量冲突 print(template.render(config=kvdata))
步骤2:修改Jinja2模板
拼接得到键名后从config字典中读取对应值即可:
{%- for index in range(1,5) %} {% set line = ['link_',index]|join %} set interface {{ config[line] }} speed 1g {% endfor %}
可选快速修复(无需修改Python代码)
如果不想调整Python传参逻辑,可以直接用Jinja2内置的vars查询器读取顶层变量:
{%- for index in range(1,5) %} {% set line = ['link_',index]|join %} set interface {{ lookup('vars', line) }} speed 1g {% endfor %}
预期渲染结果
set interface ge0/0/1 speed 1g set interface ge0/0/2 speed 1g set interface ge0/0/3 speed 1g set interface ge0/0/4 speed 1g
内容的提问来源于stack exchange,提问作者mxFrank
相关产品推荐
相关产品推荐

