摘自《Flask Web开发实战:入门、进阶与原理解析(李辉著 )》
把HTML代码存储在单独的文件中,以便让程序的业务逻辑和表现逻辑分离,即控制器和用户界面的分离。
在动态Web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成。借助模板引擎,我们可以在HTML文件中使用特殊的语法来标记出变量,这类包含固定内容和动态部分的可重用文件称为模板(template)。
模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传入的数据将变量替换为实际值,输出最终的HTML页面,这个过程被称为渲染(rendering)。
Flask默认使用的模板引擎是Jinja2,除了设置变量,还允许我们在模板中添加if判断,执行for迭代,调用函数等,以各种方式控制模板的输出。对于Jinja2来说,模板可以是任何格式的纯文本文件,比如HTML、XML、CSV、LaTeX等。
定界符
在模板中添加Python语句和表达式时,我们需要使用特定的定界符把它们标示出来。
语句,比如if判断、for循环等:
{% ... %}
表达式,比如字符串、变量、函数调用等:
{
{ ... }}
注释
{# ... #}
另外,在模板中,Jinja2支持使用“.”获取变量的属性,比如user字典
中的username键值通过“.”获取,即user.username,在效果上等同于
user['username']。
在模板中使用的←是我们第2章提及的HTML实体。HTML实
体除了用来转义HTML保留符号外,通常会被用来显示不容易通过键盘
输入的字符。这里的←会显示为左箭头,另外,我们还经常使用
©;来显示版权标志,你可以访问https://dev.w3.org/html5/htmlauthor/
charref查看所有可用的HTML实体。
模板语法
利用Jinja2这样的模板引擎,我们可以将一部分的程序逻辑放到模板中去。需要注意的是,Jinja2并不支持所有Python语法。而且出于效率和代码组织等方面的考虑,我们应该适度使用模板,仅把和输出控制有关的逻辑操作放到模板中。
Jinja2允许你在模板中使用大部分Python对象,比如字符串、列表、字典、元组、整型、浮点型、布尔值。它支持基本的运算符号(+、-、*、/等)、比较符号(比如==、!=等)、逻辑符号(and、or、not和括号)以及in、is、None和布尔值(True、False)。
Jinja2提供了多种控制结构来控制模板的输出,其中for和if是最常用的两种。在Jinja2里,语句使用{%...%}标识,尤其需要注意的是,在语句结束的地方,我们必须添加结束标签:
{% if user.bio %}
<i>{
{ user.bio }}</i>
{% else %}
<i>This user has not provided a bio.</i>
{% endif %}
和在Python里一样,for语句用来迭代一个序列:
<ul>
{% for movie in movies %}
<li>{
{ movie.name }} - {
{ movie.year }}</li>
{% endfor %}
</ul>
在for循环内,Jinja2提供了多个特殊变量: