使用 Jinja2 生成安全的动态模板

FlaskFlaskBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Python 中生成 HTML 并不有趣,实际上相当繁琐,因为你必须自己使用 escape 进行 HTML 转义,以保持应用程序的安全性。因此,Flask 会自动为你配置 Jinja2 模板引擎。模板可以用于生成任何类型的文本文件。对于 Web 应用程序,你主要会生成 HTML 页面,但你也可以生成 markdown、纯文本电子邮件以及其他任何内容。

在本实验中,我们将学习如何使用 Jinja2 模板引擎生成安全且动态的模板。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("`Flask`")) -.-> flask/DataHandlingGroup(["`Data Handling`"]) flask(("`Flask`")) -.-> flask/CoreConceptsGroup(["`Core Concepts`"]) python(("`Python`")) -.-> python/ControlFlowGroup(["`Control Flow`"]) flask(("`Flask`")) -.-> flask/DevelopmentToolsGroup(["`Development Tools`"]) python(("`Python`")) -.-> python/ModulesandPackagesGroup(["`Modules and Packages`"]) python(("`Python`")) -.-> python/AdvancedTopicsGroup(["`Advanced Topics`"]) flask/DataHandlingGroup -.-> flask/response_objects("`Response Objects`") flask/CoreConceptsGroup -.-> flask/url_route_registrations("`URL Route Registrations`") python/ControlFlowGroup -.-> python/conditional_statements("`Conditional Statements`") flask/DevelopmentToolsGroup -.-> flask/template_rendering("`Template Rendering`") python/ModulesandPackagesGroup -.-> python/importing_modules("`Importing Modules`") python/AdvancedTopicsGroup -.-> python/decorators("`Decorators`") subgraph Lab Skills flask/response_objects -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} flask/url_route_registrations -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} python/conditional_statements -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} flask/template_rendering -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} python/importing_modules -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} python/decorators -.-> lab-188849{{"`使用 Jinja2 生成安全的动态模板`"}} end

使用 Jinja2 渲染模板

在这一步中,你将使用 Jinja2 模板引擎实现模板渲染。

  1. 打开 rendering_templates.py 文件,首先导入 Flask 类和 render_template。然后创建一个 Flask 类的实例。
from flask import Flask, render_template
app = Flask(__name__)
  1. 接下来,我们使用 route() 装饰器创建两个路由 //<name>,用于共享一个名为 hello 的视图函数。要渲染模板,你可以使用 render_template() 方法。它由 Flask 提供,用于通过 Jinja2 模板引擎渲染模板。你只需提供模板的名称要传递给模板引擎的变量作为关键字参数。在视图函数中,我们使用 render_template() 方法渲染模板 hello.html,并传递一个名为 name 的变量。
@app.route('/')
@app.route('/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
  1. 创建脚本的 main 入口点,用于在某个端口(例如 port=5000)启动 Flask 应用程序。然后启用 debug 模式。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. Flask 默认会在 templates 文件夹中查找模板。因此,我们需要创建一个名为 templates 的文件夹,并在该文件夹下创建一个名为 hello.html 的文件。可以通过在终端中执行以下命令来创建所需的文件夹和文件。
cd ~/project
mkdir templates
cd templates
touch hello.html
  1. 打开 templates/hello.html 文件并编写以下代码:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}

上述代码使用了 Jinja2 中的条件块。它会检查 name 变量是否为真值(非 None 或非空)。如果是,则显示内容 Hello {{ name }}!。否则,显示内容 Hello, World!

  1. 要运行应用程序,首先使用以下命令在终端中启动 Flask 应用程序:
cd ~/project
python3 rendering_templates.py
  1. 然后打开位于界面顶部的 "Web 5000" 标签,并刷新界面。你应该会看到页面显示 Hello, World!
Flask 应用程序输出
Flask 应用程序运行输出
  1. 对于路由 /<name>,你可以直接在 URL 栏中添加后缀。例如,下面是在 URL 栏中输入后缀 flask 并显示 Hello, flask! 的示例。

    Flask 路由名称示例
    你可以尝试在 URL 栏中输入不同的 /<name> 路径,输出也会相应地改变。

总结

在本实验中,我们学习了如何使用 render_template() 方法通过 Jinja2 模板引擎渲染模板。这种方法不仅能够生动地渲染模板,还支持自动转义,有助于防止潜在的 XSS 攻击。

您可能感兴趣的其他 Flask 教程