我编写了一个python文件来从json数据中呈现jinja模板
import jinja2
from json import dumps
temploader = jinja2.FileSystemLoader(searchpath = '/')
tempenv = jinja2.Environment(loader=temploader,extensions=['jinja2.ext.loopcontrols'])
tempenv.filters['dumps'] = dumps
temp_file = "/home/templates/myfile.tmpl"
temp = tempenv.get_template(temp_file)
ifconf = [
{
"Interface": "eth0",
"IP": "172.45.100.239",
"MAC": "48:4d:7e:55:4e:z8",
"Mask": "255.255.255.0",
"MTU": "1500"
},
{
"Interface": "lo",
"IP": "127.0.0.1",
"MAC": "",
"Mask": "255.0.0.0",
"MTU": "65536"
},
{
"Interface": "tun0",
"IP": "10.120.20.229",
"MAC": "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00",
"Mask": "255.255.255.255",
"MTU": "1400"
},
{
"Interface": "vboxnet0",
"IP": "192.168.43.1",
"MAC": "0a:00:27:00:00:00",
"Mask": "255.255.255.0",
"MTU": "1500"
}
]
inp = {"data":ifconf}
out = temp.render(inp)
print out
现在,我想要的输出应该是这样的
{'Interface': ['eth0', 'lo', 'tun0', 'vboxnet0'], 'IP': ['172.23.106.239', '127.0.0.1', '10.120.233.229', '192.168.33.1'], 'MAC': ['48:4d:7e:9e:4e:b8', '', '00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00', '0a:00:27:00:00:00'], 'Mask': ['255.255.255.0', '255.0.0.0', '255.255.255.255', '255.255.255.0'], 'MTU': ['1500', '65536', '1400', '1500']}
jinja模板文件:myfile.tmpl
{%- set di = dict.fromkeys(data[0],[]) -%}
{%- for i in data -%}
{%- for k,v in di.items() -%}
{%- for x,y in i.items() -%}
{%- if x == k -%}
{%- set dummy = di[k].append(y)-%}
{%- break -%}
{%- else -%}
{%- continue -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
{{di}}
我知道如果我不使用循环控制扩展,break和continue在jinja中不起作用 . 即使使用循环控制扩展后,我也没有得到所需的输出 .
你能帮助我吗:
-
使用循环控件扩展来纠正jinja模板以获得所需的输出
-
要获得所需的输出WITHOUT循环控制扩展(因为我的要求是我不应该使用循环控制扩展 . )
2 回答
试试这个 :
一个班轮:
首先,没有理由在模板中执行此操作 . 其次,无论你在哪里,你的逻辑都可以大规模简化: