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) 0temp.format(a=1,b=2) 1temp.format(a=1,b=2) 2temp.format(a=1,b=2) 3temp.format(a=1,b=2) 4多分支语法和python类似依然使用if而不是switch
temp.format(a=1,b=2) 5temp.format(a=1,b=2) 6temp.format(a=1,b=2) 7temp.format(a=1,b=2) 8temp.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 2import string 3import string 4import string 5宏语句
jinja2中的宏就类似各种编程语言中的函数,它们用于把常用行为作为可重用的函数,取代手动重复的工作.
宏定义使用macro关键字
import string 6调用则需要import进宏,之后和变量一样使用{{}}
import string 7jinja2的import语法类似python,可以直接import一个文件也可以在文件中导入特定的宏,而且可以使用as关键字为其改名
import string 8import string 9


 
		 
		 
		 
		

还没有评论,来说两句吧...