Python 全栈系列7 -模板Jinja2

本文介绍Jinja2模板引擎的基本使用,包括变量、条件语句、循环语句等核心概念,展示如何利用Jinja2提高编程效率,特别是在Flask框架中的应用,并通过实例演示如何将Python字典转换为Cypher语句。

说明

Jinja2是一种模板生成语言,其作者也是Flask的作者。
模板生成有什么用? 减少大量的重复coding,提高效率。

环境

Jinja2 可以单独使用,安装好包以后就可以了。启动时要指明加载的路径等等,参考[Jinja2]基本使用

简单的三板斧如下:

import jinja2

1.配置模板文件搜索路径
TemplateLoader = jinja2.FileSystemLoader(searchpath=/xxx’)

2.创建环境变量
TemplateEnv = jinja2.Environment(loader=TemplateLoader)

3.加载模板,渲染数据
template = TemplateEnv.get_template(template_name)
html = template.render(**kw)

如果是在Flask使用,可以导入其下的render_template(相当于是设置好模板资源路径的Jinja2)

基本的使用方法

基本的概念在网上很容搜到,以下仅从程序的角度罗列几点:

  • 1 变量:使用 {{xx}} 表示
  • 2 If 语句:使用 {%if xxx%} 内容1 {%else%} 内容2 {%endif%}
  • 3 for语句:使用{%for x in x_list%} do with {{x}} {%endfor%}
  • 4 for语句中的索引: loop.index
  • 5 列表的长度:使用 some_list|length 来获得长度(使用|来获取对象的长度属性)
  • 6 注释:{##}

感觉这个和SAS的宏编程比较相似。在Jinja中也可以编写函数,以后有机会再续。

Jinja2的一个应用

解决函数和变量的重命名问题。
定义一个python函数,例如

def somefunc(somevar):
	print(somevar)
	return somevar

使用jinja

def {{funcname1}}({{var1}}):
	print({{var1}})
	return {{var1}}

可以先随意定义, 约定函数以func_开头,变量以var_开头,写完以后抽取出来进行替换,生成jinja文件。

例子1:从字典生成cypher创建节点的语句

将python字典通过jinja转为cypher语句。
原始的python字典:

{'id': 34488229, 'name': 'xxx', 'type': 2,
    'innode': False, 'properties': {'name': 'xxx'}}
{'id': 118525322, 'name': 'yyy', 'type': 1, 
'innode': False, 'properties': {'regno': '12345', 'esdate': '2016-12-09',
'creditcode': 'xxxx', 'regcapcur_desc': '人民币元', 'regcapcur': '156', 
'regcap': '20000.000000', 'name': 'yyy', 'entstatus': '1', 'islist': '0'}}

期望为的格式:

with [{id: 34488229, name: 'xxx', type: 2, innode: False},
         {id: 118525322, name: 'yyy', type: 1, innode: False,
          regno: '111', esdate: '2016-12-09', creditcode: '222',
          regcapcur_desc: '人民币元', regcapcur: '156', regcap: '20000.000000', islist: '0'}] as data
UNWIND data as row
merge (n{id:row.id})
on match set n.id = row.id , n.name= row.name, n.type = row.type
on create set n.id = row.id, n.name = row.name, n.type = row.type
return distinct(true) as status

jinja模板

with 
[
{% for node in node_list %}
{%if not loop.first%}
,
{%endif%}
{id:{{node.id}}
,name:'{{node.name}}'
{%if node['properties.regno']%}
,regno:'{{node['properties.regno']}}' 
{%endif%}
}
{% endfor %}
] as data 
UNWIND data as row
merge (n{id:row.id})
on match set n.id = row.id , n.name= row.name, n.regno = row.regno
on create set n.id = row.id, n.name = row.name, n.regno = row.regno
return distinct(true) as status

在python中执行之前的三板斧(中间的换行符是因为在模板中的换行产生的,不影响执行)

with 
[


{id:34488229
,name:'xxx'

}


,

{id:118525322
,name:'yyy'

,regno:'12345' 

}

] as data 
UNWIND data as row
merge (n{id:row.id})
on match set n.id = row.id , n.name= row.name, n.regno = row.regno
on create set n.id = row.id, n.name = row.name, n.regno = row.regno
return distinct(true) as status
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值