总结 python jinja2 模版使用示例。
安装
pip install jinja2
使用技巧
空行和空格剔除
例如:
{% if xxx %} # 空行 1
something...
{% endif %} # 空行 2
# 空行 3
{% if xxx %} # 空行 4
something...
{% endif %} # 空行 5
# 空行 6
{% if xxx %} # 空行 7
something...
{% endif %} # 空行 8
解决方法:
在block
中加入-
符号,例如:
------
{%- if test -%}
{%- endif -%}
{%- if test %}
{% endif -%}
保留 {{ }}
raw
和 endraw
中的 {{
和 }}
不会被替换
{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
注释
{# #}
注释,渲染模板时,注释不会包含在最终生成的文件中
示例
示例一
#!/usr/bin/env python
# coding=utf-8
from __future__ import print_function
import os
import sys
from jinja2 import Template
def main():
if len(sys.argv) != 3:
print('Usage: {} [input] [output]'.format(sys.argv[0]))
sys.exit(1)
in_path = sys.argv[1]
out_path = sys.argv[2]
with open(in_path, 'r') as in_file, open(out_path, 'w') as out_file:
tmle = Template(in_file.read())
out_file.write(tmle.render(os.environ))
if __name__ == '__main__':
main()
[test]
LANG = "{{ LANG }}"
SHELL = "{{ SHELL }}"
运行:
[root@xiexianbin_cn j2]# ./template.py abc.conf.j2 abc.conf
结果:
[root@xiexianbin_cn j2]# ll
total 12
-rw-r--r-- 1 root root 49 Jan 22 11:35 abc.conf
-rw-r--r-- 1 root root 51 Jan 22 11:35 abc.conf.j2
-rwxr-xr-x 1 root root 1113 Jan 22 10:59 template.py
[root@xiexianbin_cn j2]# cat abc.conf
[test]
LANG = "en_US.UTF-8"
SHELL = "/bin/bash"
示例二
功能:使用jinja 宏(macro)定义函数
import os
import jinja2
def render(tpl_path, context):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(
loader=jinja2.FileSystemLoader('./template')
).get_template(filename).render(context)
context = {
'firstname': 'John',
'lastname': 'Doe'
}
result = render('./template/my_tpl.html', context)
print(result)
- 模版文件 template/my_tpl.html
{% highlight html %}
{% raw %}
{% import 'macro.j2' as form %}
<p>{{ form.input('username') }}</p>
<p>{{ form.input('password', type='password') }}</p>
Hello {{ firstname }} {{ lastname }}!
{% endraw %}
{% endhighlight %}
- 宏定义文件 template/macro.j2
{% highlight html %}
{% raw %}
{% macro input(name, value='', type='text', size=20) -%}
<input type="{{ type }}" name="{{ name }}" value="{{
value|e }}" size="{{ size }}">
{%- endmacro %}
{% endraw %}
{% endhighlight %}
运行 & 结果:
[root@xiexianbin_cn jinja2_test]# python j.py
<p><input type="text" name="username" value="" size="20"></p>
<p><input type="password" name="password" value="" size="20"></p>
Hello John Doe!
示例三
for 里面引用变量:
from jinja2 import Template
t = Template("""
{% set x = a %}
My favorite numbers:
{%- for n in range(1,10) %}
{{n}} {{x}} {{a}}
{%- endfor %}
""")
print(t.render(a="123"))