Flask 模版初探
如果对HTML、Python不够熟悉,那么你会体会到难度上的一个飞跃,请各位做好准备。
在一般的 Web 程序里,访问一个地址通常会返回一个包含各类信息的 HTML 页面。因为我们的程序是动态的,页面中的某些信息需要根据不同的情况来进行调整,比如对登录和未登录用户显示不同的信息,所以页面需要在用户访问时根据程序逻辑动态生成。
我们把包含变量和运算逻辑的 HTML 或其他格式的文本叫做模板,执行这些变量替换和逻辑计算工作的过程被称为渲染,这个工作由我们这一章要学习使用的模板渲染引擎——Jinja2 来完成。
按照默认的设置,Flask 会从程序实例所在模块同级目录的 templates 文件夹中寻找模板,我们的程序目前存储在项目根目录的 app.py 文件里,所以我们要在项目根目录创建这个文件夹:
首先,把我们上节课的目录first_webapp
复制一份,把这个副本改名为templates_demo
然后在进入这个目录的命令行新建一个文件夹,名为templates(不能省略结尾的s)
Jinja2模版基本语法
举个简单的例子:
<h1>{{ username }}的个人主页</h1> {% if email %} <p>{{ email }}</p> {% else %} <p>邮箱为空。</p> {% endif %}
Jinja2 的语法和 Python 大致相同,你在后面会陆续接触到一些常见的用法。在模板里,你需要添加特定的界定符将 Jinja2 语句和变量标记出来,下面是三种常用的界定符:
-
{{ ... }}
用来标记变量。 -
{% ... %}
用来标记语句,比如 if 语句,for 语句等。 -
{# ... #}
用来写注释。
模板中使用的变量需要在渲染的时候传递进去,具体我们后面会了解。
来个真正的例子
声明:这个例子不是网上抄的
打开vscode,在templates里新建一个index.html文件
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>{{ owner.name }}'s blog</title> </head> <body> <h1>{{ owner.name }}'s blog</h1> <p>{{ owner.bio }}</p> <ul> {% for book in owner.favorite_books %} <li><i>{{ book }}</i></li> {% endfor %} </ul> <p>There are {{ owner.favorite_books | length }} books in all.</p> </body> </html>
修改app.py为
from flask import Flask, render_template app = Flask(__name__) class Blogger: def __init__(self, name, bio, favorite_books): self.name = name self.bio = bio self.favorite_books = favorite_books @app.route("/") def index(): blogger = Blogger("andy", "a pythonist", ["Three Body", "Galactic Empire"]) return render_template("index.html", owner=blogger)
运行应用:(...省略号忽略了之前的母目录,$
是提示符,Windows下一般为>,本教程为方便一律采用$
;此外为方便阅读,添加了一些空行,实际上输出并没有这些空行,以后不会再作说明)
(venv) .../flask_tutorial$ cd templates_demo (venv) .../templates_demo$ flask run * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
打开浏览器,访问localhost:5000可以看到:
代码分析
我们首先来看一下模版,我们可以看到这样一句代码{{ owner.favorite_books | length }}
,这是一个Jinja2过滤器。其实为了方便在模版中直接对变量进行处理并输出,基本语法如下:
{{ 变量|过滤器 }}
左侧是变量,右侧是过滤器名。比如,上面的模板里使用 length
过滤器来获取 owner.favorite_books
的长度,类似 Python 里的 len()
函数。
其次,我们使用了一个for循环:
{% for book in owner.favorite_books %} <li><i>{{ book }}</i></li> {% endfor %}
它表示遍历owner.favorite_books
并以斜体显示每一个书名。
我们再来看一下Python代码,它定义了一个class,包含name, bio(个人简介)和favorite_books三个属性,我们通过将这个对象的一个实例(即blogger对象)以owner
作为名称传递给模版,所以我们在模版中可以调用owner.name
、owner.bio
以及owner.favorite_books
。
小结
本节,我们学习了flask模版的初步用法,在下节中,我们将讲解flask路由
最后
请学完本课(跟着写完代码)的同学在评论区扣1,有人就继续更新;没人就鸽
This post belongs to Column 「Flask入门教程」 .