通过jinja2模板生成json文件内容的一个例子

该博客展示了如何利用Python的Jinja2库,根据j2模板生成JSON格式的ACL规则。代码示例中,创建了两个规则(RULE_1和RULE_2),包含优先级、源/目的IP和入站端口等信息。最终生成的JSON结构适用于网络配置,强调了处理字符串和序列类型的值,并提供了避免逗号冗余的方法。
摘要由CSDN通过智能技术生成

在生成acl_rule的时候,需要根据j2模板来生成具体的json格式内容。下面这个例子涉及到了一些需要注意的点

先给实现代码

$ cat add_acl_rule.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

from jinja2 import Template
import json

tmpl_str=\
'''{
    "ACL_RULE":{
        {% for ACL_RULE in ACL_RULES %}"EF_INGRESS|{{ACL_RULE['NAME']}}": {
            "MIRROR_INGRESS_ACTION": "{{SESSION_NAME}}",{% for key,value in ACL_RULE['CONTENT'].items() %}
            {% if value is string %}"{{key}}": "{{value}}"{% if not loop.last %},{% endif %}{% elif value is sequence %}"{{key}}":[
            {% for item in value %}"{{item}}"{% if not loop.last %},{% endif %}
            {% endfor %}]{% if not loop.last %},{% endif %}{% endif %}{% endfor %}
        }{% if not loop.last %},{% endif %}{% endfor %}
    }
}'''

if __name__ == '__main__':

    acl_rule1 = {'NAME':'RULE_1','CONTENT':{'PRIORITY':'9999','SRC_IP':'10.0.0.2/32','IN_PORT':['eth1','eth2']}}
    acl_rule2 = {'NAME':'RULE_2','CONTENT':{'PRIORITY':'9998','DST_IP':'10.0.0.3/32','IN_PORT':['eth1','eth2']}}    
    acl_rules = [acl_rule1,acl_rule2]


    acl_rule_templ = Template(tmpl_str)
    acl_rule_content = acl_rule_templ.render(SESSION_NAME='ABCD',ACL_RULES=acl_rules)
    print acl_rule_content

运行效果

$ python add_acl_rule.py
{
    "ACL_RULE":{
        "EF_INGRESS|RULE_1": {
            "MIRROR_INGRESS_ACTION": "ABCD",
            "PRIORITY": "9999",
            "SRC_IP": "10.0.0.2/32",
            "IN_PORT":[
            "eth1",
            "eth2"
            ]
        },"EF_INGRESS|RULE_2": {
            "MIRROR_INGRESS_ACTION": "ABCD",
            "PRIORITY": "9998",
            "DST_IP": "10.0.0.3/32",
            "IN_PORT":[
            "eth1",
            "eth2"
            ]
        }
    }
}

其中涉及到的点包括

  • 传入的key/value,其中的value有可能是string,也可能是sequence(或叫list),需要先判断
  • json文件同级的最后一项不需要逗号,统一用下面这个来判断
{% if not loop.last %},{% endif %}
  • 如果打印的结果多了一些不期望的换行,需要核对一下末班中哪里多了换行,改为紧接着上文

体验下来,用jinja2定义模板,就像按照一定的规则做填字游戏,多试几次就熟悉了。

加个jinja2的文档链接,戳这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值