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.nameowner.bio以及owner.favorite_books

小结

本节,我们学习了flask模版的初步用法,在下节中,我们将讲解flask路由

最后

请学完本课(跟着写完代码)的同学在评论区扣1,有人就继续更新;没人就鸽

This post belongs to Column 「Flask入门教程」 .

0 comments
latest

No comments yet.