本文讲述的核心库:
jinja2
官方文档:http://jinja.pocoo.org/docs/2.10/
安装
pip install jinja2
基本用法demo
直接渲染字符串
# coding:utf-8
from jinja2 import Template
def main():
tpl = Template('hell, {{name}}!')
print tpl.render(name = 'world')
if __name__ == '__main__':
main()
运行上述代码输出:
hell, world!
从文件内容渲染
假如当前文件夹下有一个名为page_template.txt
的文件,其内容如下:
hello, {{name}}!
下面在当前文件夹创建一个demo.py
脚本文件:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
def main():
env = Environment(loader = FileSystemLoader('./'))
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(name = 'world')
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,在当前目录下生成了一个page.txt
文件,其内容为:
hello, world!
模板控制语句
判断语句
page_template.txt
内容:
{# 这是一段注释,不会显示在结果中。下面展示if控制语句的用法: #}
{% if age > 80 %}
too old.
{% elif age < 10 %}
too young.
{% else %}
it's good.
{% endif %}
demo.py
内容:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
def main():
env = Environment(loader = FileSystemLoader('./'))
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(age = 10)
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,生成的page.txt
文件内容:
it's good.
可以看到在page.txt
的一开始有两个空白行,怎么去掉这两个空白行呢?只需在模板文件中的控制语句的%
符号前面或后面加-
即可,比如修改page_template.txt
如下:
{# 这是一段注释,不会显示在结果中。下面展示if控制语句的用法: #}
{%- if age > 80 -%}
too old.
{%- elif age < 10 -%}
too young.
{%- else -%}
it's good.
{%- endif -%}
再次运行demo.py
,生成的page.txt
文件内容如下:
it's good.
可以看到空白行已经没有了。
循环语句
page_template.txt
内容:
{%- for n in nums -%}
number: {{n}}
{% endfor %}
demo.py
内容:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
def main():
env = Environment(loader = FileSystemLoader('./'))
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(nums = [1,2,3])
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,生成的page.txt
文件内容:
number: 1
number: 2
number: 3
在模板中操作对象
在jinja2模板中是可以直接操作Python对象的,比如如下示例。
page_template.txt
内容:
name: {{person.name}}
age: {{person.age}}
info: {{person.get_info()}}
demo.py
内容:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def get_info(self):
return self.name + ',' + str(self.age)
def main():
env = Environment(loader = FileSystemLoader('./'))
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(person = Person('Tom',20))
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,生成的page.txt
文件内容:
name: Tom
age: 20
info: Tom,20
在模板中调用自定义函数
page_template.txt
内容:
len of {{test_str}} = {{test_str|get_len}}
sum = {{num|get_sum(2,3)}}
demo.py
内容:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
# 可以在模板中调用的函数,第一个参数必须是模板中的操作对象,在模板中用"{{操作对象名|函数名}}"的形式调用
def get_len(string):
'''
获取字符串的长度
:param string: 字符串
:return: 字符串的长度
'''
return len(string)
def get_sum(value,b,c):
'''
求1个数和另外2个数的和
:param value: 一个数
:param b: 另一个数
:param c: 第3个数
'''
return value + b + c
def main():
env = Environment(loader = FileSystemLoader('./'))
env.filters['get_len'] = get_len
env.filters['get_sum'] = get_sum
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(test_str = 'abc',num = 1)
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,生成的page.txt
文件内容:
len of abc = 3
sum = 6
模板继承
base_template.txt
内容:
This is my website.
{% block head %}
{% block title %}{% endblock %}
{% endblock %}
{% block content%}
{% endblock %}
Copyright by me.
{% block footer %}
{% endblock %}
page_template.txt
内容:
{% extends "base_template.txt" %}
{% block head %}
{% block title %}{{my_title}}{% endblock %}
这里是页面头部。
{% endblock %}
{% block content %}
这里是页面内容。
{% endblock content%}
{% block footer %}
这里是页面底部。
{% endblock %}
demo.py
内容:
# coding:utf-8
from jinja2 import Environment,FileSystemLoader
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def main():
env = Environment(loader = FileSystemLoader('./'))
tpl = env.get_template('page_template.txt')
with open('page.txt','w+') as fout:
render_content = tpl.render(my_title = 'My Index Page')
fout.write(render_content)
if __name__ == '__main__':
main()
运行demo.py
,生成的page.txt
文件内容:
This is my website.
My Index Page
这里是页面头部。
这里是页面内容。
Copyright by me.
这里是页面底部。