Flask 是一个适用于 Python 的轻量级 Web 框架,可以轻松构建 Web 应用程序。
但是,这只是一个简单的文本,如“Hello Flask!”。在实际应用中,您需要呈现的不仅仅是简单的文本。您需要呈现 HTML 模板。
在 Flask 中,我们可以使用 Jinja 来实现这一功能。
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 允许你使用模板继承,这在多个页面共享相同布局或组件时非常有用。我们可以创建一个基础模板,然后在其他模板中重复使用,而不是重复使用共同的元素。
在本示例中,我们有一个主页和一个关于我们的页面,它们共享相同的布局,如 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 的坚实起点。
评论留言