在一般的 Web 程序里,访问一个地址通常会返回一个包含各类信息的 HTML 页面。因为我们的程序是动态的,页面中的某些信息需要根据不同的情况来进行调整,比如对登录和未登录用户显示不同的信息,所以页面需要在用户访问时根据程序逻辑动态生成。

我们把包含变量和运算逻辑的 HTML 或其他格式的文本叫做模板,执行这些变量替换和逻辑计算工作的过程被称为渲染,这个工作由我们这一章要学习使用的模板渲染引擎——Jinja2 来完成。

按照默认的设置,Flask 会从程序实例所在模块同级目录的 templates 文件夹中寻找模板,我们的程序目前存储在项目根目录的 app.py 文件里,所以我们要在项目根目录创建这个文件夹:

$ mkdir templates复制代码

模板基本语法

在社交网站上,每个人都有一个主页,借助 Jinja2 就可以写出一个通用的模板:

<h1>{{ username }}的个人主页</h1>
{% if bio %}<p>{{ bio }}</p>  {# 这里的缩进只是为了可读性,不是必须的 #}
{% else %}<p>自我介绍为空。</p>
{% endif %}  {# 大部分 Jinja 语句都需要声明关闭 #}复制代码

Jinja2 的语法和 Python 大致相同,你在后面会陆续接触到一些常见的用法。在模板里,你需要添加特定的定界符将 Jinja2 语句和变量标记出来,下面是三种常用的定界符:

  • {{ ... }} 用来标记变量。
  • {% ... %} 用来标记语句,比如 if 语句,for 语句等。
  • {# ... #} 用来写注释。

模板中使用的变量需要在渲染的时候传递进去,具体我们后面会了解。

编写主页模板

我们先在 templates 目录下创建一个 index.html 文件,作为主页模板。主页需要显示电影条目列表和个人信息,代码如下所示:

templates/index.html:主页模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>{{ name }}'s Watchlist</title>
</head>
<body><h2>{{ name }}'s Watchlist</h2>{# 使用 length 过滤器获取 movies 变量的长度 #}<p>{{ movies|length }} Titles</p><ul>{% for movie in movies %}  {# 迭代 movies 变量 #}<li>{{ movie.title }} - {{ movie.year }}</li>  {# 等同于 movie['title'] #}{% endfor %}  {# 使用 endfor 标签结束 for 语句 #}</ul><footer><small>&copy; 2018 <a href="http://helloflask.com/tutorial">HelloFlask</a></small></footer>
</body>
</html>复制代码

为了方便对变量进行处理,Jinja2 提供了一些过滤器,语法形式如下:

{{ 变量|过滤器 }}复制代码

左侧是变量,右侧是过滤器名。比如,上面的模板里使用 length 过滤器来获取 movies 的长度,类似 Python 里的 len() 函数。

提示 访问 http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-filters 查看所有可用的过滤器。

准备虚拟数据

为了模拟页面渲染,我们需要先创建一些虚拟数据,用来填充页面内容:

app.py:定义虚拟数据

name = 'Grey Li'
movies = [{'title': 'My Neighbor Totoro', 'year': '1988'},{'title': 'Dead Poets Society', 'year': '1989'},{'title': 'A Perfect World', 'year': '1993'},{'title': 'Leon', 'year': '1994'},{'title': 'Mahjong', 'year': '1996'},{'title': 'Swallowtail Butterfly', 'year': '1996'},{'title': 'King of Comedy', 'year': '1999'},{'title': 'Devils on the Doorstep', 'year': '1999'},{'title': 'WALL-E', 'year': '2008'},{'title': 'The Pork of Music', 'year': '2012'},
]复制代码

渲染主页模板

使用 render_template() 函数可以把模板渲染出来,必须传入的参数为模板文件名(相对于 templates 根目录的文件路径),这里即 'index.html'。为了让模板正确渲染,我们还要把模板内部使用的变量通过关键字参数传入这个函数,如下所示:

app.py:返回渲染好的模板作为响应

from flask import Flask, render_template# ...@app.route('/')
def index():return render_template('index.html', name=name, movies=movies)复制代码

为了更好的表示这个视图函数的作用,我们把原来的函数名 hello 改为 index,意思是“索引”,即主页。

在传入 render_template() 函数的关键字参数中,左边的 movies 是模板中使用的变量名称,右边的 movies 则是该变量指向的实际对象。这里传入模板的 name 是字符串,movies 是列表,但能够在模板里使用的不只这两种 Python 数据结构,你也可以传入元组、字典、函数等。

render_template() 函数在调用时会识别并执行 index.html 里所有的 Jinja2 语句,返回渲染好的模板内容。在返回的页面中,变量会被替换为实际的值(包括定界符),语句(及定界符)则会在执行后被移除(注释也会一并移除)。

现在访问 http://localhost:5000/ 看到的程序主页如下图所示:

本章小结

这一章我们编写了一个简单的主页。结束前,让我们提交代码:

$ git add .
$ git commit -m "Add index page"
$ git push复制代码

提示 你可以在 GitHub 上查看本书示例程序的对应 commit:17b579d

进阶提示

  • 使用 Faker 可以实现自动生成虚拟数据,它支持丰富的数据类型,比如时间、人名、地名、随机字符等等……
  • 除了过滤器,Jinja2 还在模板中提供了一些测试器、全局函数可以使用;除此之外,还有更丰富的控制结构支持,有一些我们会在后面学习到,更多的内容则可以访问 Jinja2 文档学习。
  • 如果你是《Flask Web 开发实战》的读者,模板相关内容可以在第 3 章《模板》找到,Faker 相关内容可以在第 7 章找到。

《Flask 入门教程》第 3 章:模板相关推荐

  1. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  2. python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)

    一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...

  3. OUYA游戏开发快速入门教程第1章了解OUYA及其设备

    OUYA游戏开发快速入门教程第1章了解OUYA及其设备 OUYA是基于Andorid系统的游戏主机.围绕OUYA游戏机,已经形成一个完整的生态圈.在国外,OUYA已经成为知名的游戏平台.本章会站在玩家 ...

  4. BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们

    BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们 Maker的中文含义类似"创客".创客是指一群酷爱科技.热衷实践的人群,他们以分享技术.交流思想 ...

  5. ArduinoYun快速入门教程第1章ArduinoYun概览

    ArduinoYun快速入门教程第1章ArduinoYun概览 本章是全书的开篇,在本章笔者将把Arduino以及Yun的方方面面介绍给大家.其中包括Arduino这个术语的解释.Yun相对其他开发板 ...

  6. 关于flask入门教程-ajax+echarts实现大屏展示

    陆陆续续写了一个系列的flask入门教程了,最后以一个半成品大屏做个了结,也算是一段时间的成果吧,毕竟不是专业码农,只是爱好而已,还有很多其他的事情等待探索. 大屏用到的技术主要包括标准的HTML.C ...

  7. D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

    D3.js的v5版本入门教程(第一章) 1.需要的一些工具 这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端, ...

  8. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

  9. 《Flask 入门教程》 第 2 章:Hello, Flask!

    追溯到最初,Flask 诞生于 Armin Ronacher 在 2010 年愚人节开的一个玩笑.后来,它逐渐发展成为一个成熟的 Python Web 框架,越来越受到开发者的喜爱.目前它在 GitH ...

  10. Python之Flask入门教程

    Flask简介 Flask是一个用python编写的Web应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask.Flask基于Werkzeug ...

最新文章

  1. JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期
  2. 计算机应用基础(高起专)答案,东北师范大学14秋《计算机应用基础(高起专)》14秋在线作业1答案...
  3. Java8新特性总结 - 3. Lambda表达式
  4. [绝对原创]从VS2003(.net1.1)升级到vs2005(.net2.0)全程跟踪记录
  5. python压缩与读取.tar.bz2压缩包
  6. 基于Socket的文件传输(使用CSocket类)
  7. bzoj 1116: [POI2008]CLO(并查集)
  8. Redis数据类型及其命令
  9. 车载激光扫描系统检校
  10. 【密码学 | CTF】培根密码
  11. dns服务器 响应超时,DNS 客户端解析超时 - Windows Server | Microsoft Docs
  12. 计算机无法访问网络位置,共享不能访问网络位置的解决方法
  13. 软件实施是一个什么样的职位?
  14. 1907 Problem A 吃糖果
  15. 心跳与超时:高并发高性能的时间轮超时器
  16. C++ STL之命名空间、函数模板、类模板
  17. boost::asio编程-同步TCP
  18. 基于Android Q的OTA包制作/签名(包含差分包)
  19. 用flatpak安装程序(比如GIMP)的方法
  20. html display

热门文章

  1. rtems源码树结构
  2. MyEclipse10 离线图文安装SVN插件教程
  3. Oracle PLSQL Demo - 04.数字FOR LOOP循环[NUMBERABLE (FOR) LOOP]
  4. The Famous Clock
  5. 在centos上完全删除mysql
  6. ASP.NET 2.0 – 善用DataSourceMode属性 (转自章立民CnBlogs)
  7. 上传文件到阿里云OSS对象存储,查询访问地址,删除文件
  8. docker on spark
  9. push_back模式工作
  10. linux初识到入门_系统