1. 文本模板
文本模板是一个很常见的需求,像mvc模式的http服务器就需要模板来映射m层和v层,脚手架工具也需要模板用来生成可用代码,像airflow也需要模板来传递参数等
python自带模板功能,只是功能不完善,更多的时候我们使用jinja2做模板引起
1.1. 使用str.format作为模板
我们当然可以使用使用字符串的format函数来做模板,这是最轻量的模板了
temp = "a:{a},b:{b}"
temp.format(a=1,b=2)
'a:1,b:2'
1.2. 使用string.Template作为模板
在format之外,python的标准库string
也提供了基本的模板功能,模板使用美元符号表示占位符
import string
s = string.Template('$who likes $what') s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
1.3. 使用jinja2做为模板
上面两种模板只能定义简单的模板,如果模板中需要引入抽象,比如有循环,根据变量来判断生成什么样的结果,有继承关系组合关系,就不合适了,jinja2是一个成熟的模板引擎,广泛使用在许多领域,也是著名python网络框架flask的默认模板引擎.
jinja2作为一个主要为mvcweb框架服务的模板引擎自然会有很多设置项和针对web框架场景的优化功能,本文不考虑这类问题,单纯将其作为一个模板引擎来介绍
jinja2作为模板引擎,其基本的使用流程是
- 根据模板语法定义模板字符串
- 渲染这个字符串
jinja2提供了低级api和高级api:
- 低级api
from jinja2 import Template template = Template('Hello {{ name }}!') template.render(name='John Doe')
'Hello John Doe!'
- 高级api
from jinja2 import Environment env = Environment() template = env.from_string('Hello {{ name }}!') template.render(name='John Doe')
'Hello John Doe!'
这两种方式都可以正确的渲染模板,高级api更多的是为了管理模板来源.很多时候模板并不是文本而是存在文件中,Environment
更多的是一个模板文件管理器的角色.本文将以高级api作为主要介绍对象,因为如果要考虑继承,就必须使用高级接口
1.3.1. 模板语法
模板中的注释使用{# 这是注释 #}
这样的形式;变量使用{{ x }}
形式来表示;而语句则使用{% if x>0 %} {% endif%}
这种形式;
模板语句大致可以分为3类:
流程控制语句
模板复用语句
宏语句
具体的模板语法可以看文档中的相关描述,本文只是做基本的介绍
流程控制语句
流程控制语句就是2种
- 判断分支
基础的二分支语法如下:
temp.format(a=1,b=2)
0
temp.format(a=1,b=2)
1
temp.format(a=1,b=2)
2
temp.format(a=1,b=2)
3
temp.format(a=1,b=2)
4
多分支语法和python类似依然使用if而不是switch
temp.format(a=1,b=2)
5
temp.format(a=1,b=2)
6
temp.format(a=1,b=2)
7
temp.format(a=1,b=2)
8
temp.format(a=1,b=2)
9
'a:1,b:2'
0
'a:1,b:2'
1
- 循环
基础的循环形式如下:
'a:1,b:2'
2
'a:1,b:2'
3
'a:1,b:2'
4
在此之上也可以使用类似python列表解析的语法:
'a:1,b:2'
5
'a:1,b:2'
6
'a:1,b:2'
7
然后我们也可以递归的遍历
'a:1,b:2'
8
'a:1,b:2'
9
模板复用语句
模板复用依赖于Loader,通常会用到复用自然文本都保存在文件中,这边为了演示清楚我们就用DictLoader
来代替.
用于模块化的语句有3种:
block语句用于标识出可以被继承替换的段落,如果不被替换其中的内容就会被渲染 ```
...
import string
0
{% extends "base.html" %} ...
import string
1
{% block head %} {{ super() }} {% endblock head%}
import string
2
import string
3
import string
4
import string
5
宏语句
jinja2中的宏就类似各种编程语言中的函数,它们用于把常用行为作为可重用的函数,取代手动重复的工作.
宏定义使用macro
关键字
import string
6
调用则需要import进宏,之后和变量一样使用{{}}
import string
7
jinja2的import语法类似python,可以直接import一个文件也可以在文件中导入特定的宏,而且可以使用as
关键字为其改名
import string
8
import string
9
还没有评论,来说两句吧...