如何在Flask中渲染HTML模板

Flask 是一个适用于 Python 的轻量级 Web 框架,可以轻松构建 Web 应用程序。

但是,这只是一个简单的文本,如“Hello Flask!”。在实际应用中,您需要呈现的不仅仅是简单的文本。您需要呈现 HTML 模板。

在 Flask 中,我们可以使用 Jinja 来实现这一功能。

如何在Flask中渲染HTML模板

Jinja

它的强大功能之一是使用 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 允许你使用模板继承,这在多个页面共享相同布局或组件时非常有用。我们可以创建一个基础模板,然后在其他模板中重复使用,而不是重复使用共同的元素。

在本示例中,我们有一个主页和一个关于我们的页面,它们共享相同的布局,如 headtitle和后面的一些样式或脚本。通过模板继承,我们可以让事情变得更简单、更有条理。

首先,我们创建基础文件。命名为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 结构,如 headtitle 标记,并用 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 的坚实起点。

评论留言