Flask 是一个适用于 Python 的轻量级 Web 框架,可以轻松构建 Web 应用程序。
但是,这只是一个简单的文本,如“Hello Flask!”。在实际应用中,您需要呈现的不仅仅是简单的文本。您需要呈现 HTML 模板。
在 Flask 中,我们可以使用 来实现这一功能。

它的强大功能之一是使用 Jinja 模板引擎呈现 HTML 模板。
Jinja 模板是用您已经熟悉的普通 HTML 编写的。但除此之外,您还可以使用特殊的语法来处理动态内容,例如从请求或其他代码源向模板传递数据。还可以使用循环和条件等控制结构。
让我们来看看它的基本工作方式:
<!DOCTYPE html> <html> <head> <title>Welcome to Flask</title> </head> <body> {% if user.is_logged_in %} <p>Welcome back, {{ user.name }}!</p> {% else %} <p>Please log in to continue.</p> {% endif %} </body> </html>
它看起来像一个普通的 HTML 文件,但正如我们所看到的,我们使用了一些特殊的语法,如 {{ }} 来插入变量,使用 {% %} 来添加循环和条件。
要渲染模板,我们需要将其放入 templates 目录。
. |-- app.py |-- templates |-- about.html |-- index.html
然后,我们在 Python 应用程序文件中使用 render_template 函数来渲染 HTML 模板。如果我们扩展中的相同代码,我们的代码现在看起来就像下面这样:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/about')
def about():
return render_template('about.html')
在上述模板中,我们有 {{ name }} 和 {{ user.is_logged_in }} 变量。但是,我们还没有向模板传递任何变量。
要向模板传递变量,我们可以将它们作为参数传递给 render_template 函数。
例如:
@app.route('/')
def home():
return render_template('index.html', user={'is_logged_in': True, 'name': 'Joann'})
现在,当我们访问主页时,我们将看到“Welcome back, Joann!”信息,而不是“Please log in to continue.”,因为 is_logged_in 设置为 True。
Jinja 允许你使用模板继承,这在多个页面共享相同布局或组件时非常有用。我们可以创建一个基础模板,然后在其他模板中重复使用,而不是重复使用共同的元素。
在本示例中,我们有一个主页和一个关于我们的页面,它们共享相同的布局,如 head, title和后面的一些样式或脚本。通过模板继承,我们可以让事情变得更简单、更有条理。
首先,我们创建基础文件。命名为base.html 。然后,添加常用元素:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Welcome to Flask{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
在此模板中有两个区块:一个用于标题,另一个用于内容。{% block %}标签允许子模板覆盖基础模板的特定部分。
现在,我们可以重写 index.html 文件来扩展 base.html 文件。我们可以删除 index.html 文件中的所有基本 HTML 结构,如 head 和 title 标记,并用 extends 标记取而代之。
{% extends 'base.html' %}
{% block title %}Welcome to Flask{% endblock %}
{% block content %}
{% if user.is_logged_in %}
<p>Welcome back, {{ user.name }}!</p>
{% else %}
<p>Please log in to continue.</p>
{% endif %}
{% endblock %}
在“关于我们 ”页面,我们也可以将其改写如下:
{% extends 'base.html' %}
{% block title %}About Us{% endblock %}
{% block content %}
<p>This is the about page.</p>
{% endblock %}
当我们访问主页时,如果用户已登录,就会看到信息。而在关于页面,我们会看到“This is the about page.”。这里的区别在于,这两个页面都更简洁,更易于维护,不需要重复代码。
这就是我们如何使用 Jinja 在 Flask 中呈现 HTML 模板。Jinja 是一个功能强大的模板引擎,它提供了很多有用的功能和,让我们可以更轻松地用 Python 构建动态 Web 应用程序。
要探索的东西还有很多,但我希望这篇文章能为您提供一个使用 Flask 的坚实起点。
宝塔面板提供丰富的软件以一键安装,这让服务器环境搭建提供不少的便利性,站长可以根据实际需求快速编译安装以实现不同的功能需求。 软件管理,主要是宝塔提供的一些面板扩展插件。 Nginx Nginx是一个高性能的HTTP和反向代理服务器,具有轻量级、占用内存小,并发能力强等优势。 w...
宝塔面板的计划任务,主要用于安排和管理需要定时执行的任务,如备份、内存清理等。其实对于大部分站长来说,主要使用该板块的备份网站、备份数据库及释放内存的三个定时任务计划。 Shell脚本的添加 输入任务名称,选择执行周期,输入执行的脚本内容。 注意事项: 输入脚本内容...
想成为一名网络开发人员或好奇工作的哪些子类型的薪水最高?Web开发是一个竞争激烈、多样化的行业,随着新语言和框架的出现而不断发展。 询问Web开发人员的薪水是一个难以解决的问题(尽管我们尝试)。有太多的因素需要考虑。 无论您是自由开发者还是有兴趣从事更传统的工作、喜欢前端或后端工作,或者想知...
市场上有各种各样的数据库可供选择,用户通常可以仔细考虑PostgreSQL与SQL Server,以便为他们的用例找出更好的选择。使用PostgreSQL进行运营的组织可能希望切换到像Microsoft SQL Server这样的数据库,因为它主要迎合不同的数据仓库解决方案、电子商务和其他业务线...
SaaS、IaaS和PaaS这三个术语几乎可以互换使用——尽管它们根本不能互换。那么它们之间有什么区别呢? 虽然您可能听说过软件即服务 (SaaS),但IaaS和PaaS在特定技术社区之外鲜为人知。分别是基础架构即服务和平台即服务的缩写,这些工具以及SaaS都通过云交付资源。然而,正是交付的资...
DragonflyDB是一个内存数据存储应用程序,可以帮助提高网站性能。 DragonflyDB DragonflyDB是一个免费的内存数据存储应用程序,运行在Linus OS上。它使用每核线程架构来减少延迟。Dragonfly与Redis和Memcached兼容。它是KeyDB的合...