本文講述的核心庫:
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.
這里是頁面底部。