美文网首页
三、Jinja2 模板

三、Jinja2 模板

作者: 安东尼卡 | 来源:发表于2020-03-01 09:27 被阅读0次
#定义模板中使用的数据
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'}, 
]
<!--该文本保存为watchlist.html-->
<!DOCTYPE html> 
<html lang="en"> 
<head><meta charset="utf-8"> <title>{{ user.username }}'s Watchlist</title> </head> 
<body>
<a href="{{ url_for('index') }}">&larr; Return</a>
<h2>{{ user.username }}</h2> 
{% if user.bio %} 
<i>{{ user.bio }}</i> 
{% else %} 
<i>This user has not provided a bio.</i>
{% endif %} 
{# 下面是电影清单(这是注释) #} 
<h5>{{ user.username }}'s Watchlist ({{ movies|length }}):</h5>
 <ul>
{% for movie in movies %} 
<li>{{ movie.name }} - {{ movie.year }}</li>
{% endfor %} 
</ul>
</body>
</html>

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 模板

      本文链接:https://www.haomeiwen.com/subject/pzgfhhtx.html