三、Jinja2 模板

#定义模板中使用的数据
user = { 
        'username': 'Grey Li', 
        'bio': 'A boy who loves movies and music.',
 }
movies = [
{'name': 'My Neighbor Totoro', 'year': '1988'},
{'name': 'Three Colours trilogy', 'year': '1993'},
{'name': 'Forrest Gump', 'year': '1994'}, 
{'name': 'Perfect Blue', 'year': '1997'}, 
{'name': 'The Matrix', 'year': '1999'}, 
{'name': 'Memento', 'year': '2000'}, 
{'name': 'The Bucket list', 'year': '2007'}, 
{'name': 'Black Swan', 'year': '2010'}, 
{'name': 'Gone Girl', 'year': '2014'},
{'name': 'CoCo', 'year': '2017'}, 
]

 
 
 {{ user.username }}'s Watchlist  

← Return

{{ user.username }}

{% if user.bio %} {{ user.bio }} {% else %} This user has not provided a bio. {% endif %} {# 下面是电影清单(这是注释) #}
{{ user.username }}'s Watchlist ({{ movies|length }}):
    {% for movie in movies %}
  • {{ movie.name }} - {{ movie.year }}
  • {% endfor %}

1.Jinja2中常见三种定界符

  • 语句
    比如,if判断、for循环{% ... %};
  • 表达式
    比如字符串、变量、函数调用等{{ ... }}
  • 注释
    注释语句{# ... #}
    Jinja2提供了多种控制结构来控制模板的输出,其中for和if是最常用的两种。在Jinja2里,语句使用{%...%}标识,尤其需要注意的是,在语 句结束的地方,我们必须添加结束标签,即{% if %} {% endif%} 、{% for %} {% endfor%}需要配对使用。

2.常用的Jinja for循环特殊变量

变量名 说明
loop.index 循环迭代计数(从1开始)
loop.index0 循环迭代计数(从0开始)
loop.revindex 循环迭代倒序计数(从len开始,到1结束)
loop.revindex0 循环迭代倒序计数(从len-1开始,到0结束)
loop.first 是否为循环的第一个元素
loop.last 是否为循环的最后一个元素
loop.length 循环序列中元素的个数
loop.cycle 在给定的序列中轮循,如上例在”odd”和”even”两个值间轮循
loop.depth 当前循环在递归中的层级(从1开始)
loop.depth0 当前循环在递归中的层级(从0开始)

3.渲染模板
模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传入的数据将变量替换为实际值,输出最终的HTML页面,这个过程被称为渲染(rendering)
渲染一个模板,就是执行模板中的代码,并传入所有在模板中使用 的变量,渲染后的结果就是我们要返回给客户端的HTML响应。在视图 函数中渲染模板时,我们并不直接使用Jinja2提供的函数,而是使用 Flask提供的渲染函数render_template(),如代码清单3-2所示。

from flask import Flask, render_template 
#定义模板中使用的数据
...

@app.route('/watchlist') 
def watchlist(): 
    return render_template('watchlist.html', user=user, movies=movies)

在render_template()函数中,我们首先传入模板的文件名作为参数。Flask会在程序根目录下的templates文件夹里寻找模板文件,所以这里传入的文件路径是相对于templates根目录的。除了模板文件路径,我们还以关键字参数的形式传入了模板中使用的变量值,以user为例:左边的user表示传入模板的变量名称,右边的user则是要传入的对象。

4.过滤器
在Jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的 特殊函数,过滤器和变量用一个竖线(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递。下面是一个对name变量使用title过 滤器的例子:{{ name|title }}这会将name变量的值标题化,相当于在Python里调用 name.title()。再比如,我们在本章开始的示例模板watchlist.html中使 用length获取movies列表的长度,{{ movies|length }}类似于在Python中调用 len(movies)

另一种用法是将过滤器作用于一部分模板数据,使用filter标签和endfilter标签声明开始和结束。比如,下面使用upper过滤器将一段文字转换为大写:

{% filter upper %} 
This text becomes uppercase. 
{% endfilter %}

常用的过滤器列表
image.png

5.测试器
在Jinja2中,测试器(Test)是一些用来测试变量或表达式,返回布 尔值(True或False)的特殊函数。比如,number测试器用来判断一个变量或表达式是否是数字,我们使用is连接变量和测试器

{% if age is number %}
{{ age * 365 }} 
{% else %} 
无效的数字。 
{% endif %}

常用的测试器
image.png

你可能感兴趣的:(三、Jinja2 模板)