2017-04-26 51 views
0

我写了一个Python文件,以使从JSON数据的神社模板现在如何写嵌套for和ifs的python代码的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']} 

的神社模板文件: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中不起作用。 即使使用循环控制扩展后,我没有得到所需的输出。

难道你们,请帮我:

  1. 要使用闭环控制的扩展,从而获得所需的输出

  2. 为了获得无闭环控制扩展所需的输出(因为我的要求纠正神社模板是我不应该使用循环控制扩展。)

+0

@DanielRoseman试图获得所需的输出上文提到的。 – sans0909

回答

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} 
+0

不,我只是在办公室为我的工作练习jinja模板,我正在尝试任务。 – sans0909