在一般的 Web 程序里,访问一个地址通常会返回一个包含各类信息的 HTML 页面。因为我们的程序是动态的,页面中的某些信息需要根据不同的情况来进行调整,比如对登录和未登录用户显示不同的信息,所以页面需要在用户访问时根据程序逻辑动态生成。
我们把包含变量和运算逻辑的 HTML 或其他格式的文本叫做模板,执行这些变量替换和逻辑计算工作的过程被称为渲染(模板渲染引擎——Jinja2)。
按照默认的设置,Flask 会从程序实例所在模块同级目录的 templates 文件夹中寻找模板。
模板基本语法
在模板里,你需要添加特定的定界符将 Jinja2 语句和变量标记出来
下面是三种常用的定界符:
1、{{ … }} 用来标记变量。
2、{% … %} 用来标记语句,比如 if 语句,for 语句等。
3、{# … #} 用来写注释。
模板中使用的变量需要在渲染的时候传递进去。
编写主页模板
我们先在 templates 目录下创建一个 movie.html 文件,作为主页模板。主页需要显示电影条目列表和个人信息,代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>movie list < / title> < / head> <body> { # 使用 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> < / body> < / html> |
为了方便对变量进行处理,Jinja2 提供了一些过滤器(和Vue.js框架中的过滤器有着异曲同工之妙),语法形式如下:
{{ 变量|过滤器 }}
左侧是变量,右侧是过滤器名。比如,上面的模板里使用 length 过滤器来获取movies 的长度,类似 Python 里的 len() 函数。
准备虚拟数据
为了模拟页面渲染,我们需要先创建一些虚拟数据,用来填充页面内容,其中template.py中定义虚拟数据。
1
|
movies = [{ 'title' : '长津湖' , 'year' : '2021' },{ 'title' : '送你一朵小红花' , 'year' : '2021' }] |
渲染主页模板
使用 render_template() 函数可以把模板渲染出来,必须传入的参数为模板文件名(相对于 templates 根目录的文件路径),这里即 ‘movie.html' 。为了让模板正确渲染,我们还要把模板内部使用的变量通过关键字参数传入这个函数,如下所示:
1
2
3
4
5
6
7
8
9
|
from flask import Flask, render_template app = Flask(__name__) @app .route( '/' ) def movie(): return render_template( 'movie.html' , movies = movies) if __name__ = = "__main__" : app.run() |
在传入 render_template()
函数的关键字参数中,左边的 movies 是模板中使用的变量名称,右边的movies 则是该变量指向的实际对象。这里传入模板的movies 是列表,但能够在模板里使用的不只这一种 Python数据结构,你也可以传入字符串、元组、字典、函数等。
render_template()
函数在调用时会识别并执行 “movie.html” 里所有的 Jinja2 语句,返回渲染好的模板内容。在返回的页面中,变量会被替换为实际的值(包括定界符),语句(及定界符)则会在执行后被移除(注释也会一并移除)。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/julac/article/details/121267284