一个完整HTML页面往往需要几十甚至几百行代码,不可能都写在视图函数中,程序的业务逻辑和表现逻辑要分离。正确的做法是将HTML代码存储在单独的模板文件中。模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传入的数据将变量替换为实际值,输出最终的HTML页面,这个过程称为渲染。Flask使用的默认模版引擎是Jinja2。
渲染模板就是执行模板中的代码,并传入所有在模板中使用的变量。渲染后的结果就是我们要返回给客户端的HTML响应。
创建模板
在templates目录下创建html文件watchlist.html,代码清单如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{
{ user.username }}'s Watchlist</title>
</head>
<body>
<h2>{
{ user.username }}</h2>
{% if user.bio %}
<i>{
{ user.bio }}</i>
{% else %}
<i>This user has not provided a bio.</i>
{% endif %}
{# Below is the movie list (this is comment) #}
<h5>{
{ user.username }}'s Watchlist ({
{ movies|length }}):</h5>
<ul>
{% for movie in movies %}
<li>{
{ movie.name }} - {
{ movie.year }}</li>
{% endfor %}
</ul>
</body>
</html>
模板中添加Python语句和表达式时,我们需要使用特定的定界符把他们标出来。Jinja2中常见的三种定界符:
(1) 语句
比如if判断、for循环:
{%.......%}
(2) 表达式
比如字符串、变量、函数调用等:
{
{.......}}
(3) 注释
{#.......#}
Jinja2允许在模板中使用大部分Python对象,比如字符串、列表、字典、元组、整型、浮点型、布尔值。它支持基本的运算符号(+、-、*、/等)、比较符号(==、!=等)、逻辑符号(and、or、not和括号)以及in、is、None等。
渲染模板
在视图函数中渲染模板时,并不直接使用Jinja2提供的函数,而是使用Flask提供的渲染函数render_template()。该函数第一个参数是模板文件相对于templates文件夹的路径,后面的参数是模板中使用的变量值。app.py代码清单如下:
from flask import Flask,render_template
app = Flask(__name__)
user = {
'username': 'Grey Li',
'bio': 'A boy who loves movies and music.',
}
movies = [
{
'name': 'My Neighbor Totoro', 'year': '1988'},
{
'name': 'Three Colours trilogy', 'year'