首页 文章

如何用嵌套for和ifs编写python代码的jinja模板?

提问于
浏览
0

我编写了一个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 回答

  • 1

    试试这个 :

    dic = {}
    for i in ifconf[0].keys():
        l = [j[i] for j in ifconf]
        dic[i] = l
    
    print(dic)
    {'IP': ['172.45.100.239', '127.0.0.1', '10.120.20.229', '192.168.43.1'],
     'Interface': ['eth0', 'lo', 'tun0', 'vboxnet0'],
     'MAC': ['48:4d:7e:55:4e:z8','','00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00',
      '0a:00:27:00:00:00'],
     'MTU': ['1500', '65536', '1400', '1500'],
     'Mask': ['255.255.255.0', '255.0.0.0', '255.255.255.255', '255.255.255.0']}
    

    一个班轮:

    >>> { i:[j[i] for j in ifconf] for i in ifconf[0].keys() }
    
  • 1

    首先,没有理由在模板中执行此操作 . 其次,无论你在哪里,你的逻辑都可以大规模简化:

    keys = ifconf[0].keys()
    data = {key: [val[key] for val in ifconf] for key in keys}
    

相关问题