模板 — Flask 文档
模板
您已经为应用程序编写了身份验证视图,但是如果您正在运行服务器并尝试访问任何 URL,您将看到 TemplateNotFound
错误。 那是因为视图正在调用 render_template()
,但您还没有编写模板。 模板文件将存储在 flaskr
包内的 templates
目录中。
模板是包含静态数据以及动态数据占位符的文件。 使用特定数据呈现模板以生成最终文档。 Flask 使用 Jinja 模板库来渲染模板。
在您的应用程序中,您将使用模板来呈现将在用户浏览器中显示的 HTML。 在 Flask 中,Jinja 被配置为 autoescape 在 HTML 模板中呈现的任何数据。 这意味着呈现用户输入是安全的; 他们输入的任何可能与 HTML 混淆的字符,例如 <
和 >
将被 escaped 与 safe 值看起来相同在浏览器中,但不会造成不必要的影响。
Jinja 的外观和行为很像 Python。 特殊的分隔符用于将 Jinja 语法与模板中的静态数据区分开来。 {{
和 }}
之间的任何内容都是将输出到最终文档的表达式。 {%
和 %}
表示类似于 if
和 for
的控制流语句。 与 Python 不同,块由开始和结束标记而不是缩进表示,因为块内的静态文本可能会改变缩进。
基本布局
应用程序中的每个页面都将围绕不同的主体具有相同的基本布局。 不是在每个模板中编写整个 HTML 结构,每个模板将 扩展 一个基本模板并覆盖特定部分。
flaskr/templates/base.html
g 在模板中自动可用。 根据是否设置了 g.user
(从 load_logged_in_user
),要么显示用户名和注销链接,要么显示注册和登录链接。 url_for()
也是自动可用的,用于生成视图的 URL,而不是手动写出它们。
在页面标题之后,内容之前,模板循环遍历 get_flashed_messages()
返回的每条消息。 您在视图中使用了 flash()
来显示错误消息,这是显示它们的代码。
这里定义了三个块,它们将在其他模板中被覆盖:
{% block title %}
将更改浏览器选项卡中显示的标题和窗口标题。{% block header %}
与title
类似,但会改变页面显示的标题。{% block content %}
是每个页面的内容所在,例如登录表单或博客文章。
基础模板直接在templates
目录下。 为了保持其他组织的有序性,蓝图的模板将放置在与蓝图同名的目录中。
注册
flaskr/templates/auth/register.html
{% extends 'base.html' %}
告诉 Jinja 这个模板应该替换基础模板中的块。 所有渲染的内容必须出现在 {% block %}
标签中,这些标签覆盖了基本模板中的块。
这里使用的一个有用的模式是将 {% block title %}
放在 {% block header %}
内。 这将设置标题块,然后将其值输出到标题块中,以便窗口和页面共享相同的标题,而无需两次写入。
input
标签在这里使用 required
属性。 这告诉浏览器在填写这些字段之前不要提交表单。 如果用户使用不支持该属性的旧浏览器,或者他们使用浏览器以外的其他东西来发出请求,您仍然希望在 Flask 视图中验证数据。 始终完全验证服务器上的数据很重要,即使客户端也进行了一些验证。
登录
除了标题和提交按钮外,这与注册模板相同。
flaskr/templates/auth/login.html
注册用户
现在已经编写了身份验证模板,您可以注册用户。 确保服务器仍在运行(flask run
如果不是),然后转到 http://127.0.0.1:5000/auth/register。
尝试在不填写表单的情况下单击“注册”按钮,然后查看浏览器是否显示错误消息。 尝试从 register.html
模板中删除 required
属性,然后再次单击“注册”。 浏览器不会显示错误,而是会重新加载页面并显示来自视图中 flash()
的错误。
填写用户名和密码,您将被重定向到登录页面。 尝试输入错误的用户名,或正确的用户名和错误的密码。 如果您登录,您将收到错误消息,因为还没有 index
视图可以重定向到。
继续静态文件。