4. Flask模板渲染

任务说明

本案例将使用 Flask 框架与 Jinja2 模板引擎,实现一个动态商品列表页面。页面通过模板接收后端传递的页面标题、欢迎语以及商品列表数据,利用 Jinja2 的变量插值与循环语法完成渲染,最终在浏览器中展示动态生成的 HTML 内容。

项目结构与依赖

首先创建项目目录并安装 Flask(Jinja2 为 Flask 默认模板引擎,无需单独安装):

mkdir flask_template_demo
cd flask_template_demo
pip install flask

项目包含两个文件:

  • app.py — Flask 应用主程序,负责路由与数据传递
  • templates/index.html — Jinja2 模板文件,负责页面结构与动态渲染

实现代码

app.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    # 准备传递给模板的数据
    page_title = "商品中心"
    welcome_msg = "欢迎光临示例商城"
    products = [
        {"name": "机械键盘", "price": 299, "stock": 15},
        {"name": "无线鼠标", "price": 89, "stock": 0},
        {"name": "27寸显示器", "price": 1299, "stock": 8},
        {"name": "USB-C 扩展坞", "price": 199, "stock": 32}
    ]
    # 渲染模板并传递变量
    return render_template('index.html',
                           title=page_title,
                           welcome=welcome_msg,
                           items=products)

if __name__ == '__main__':
    app.run(debug=True, port=5000)

templates/index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h3>{{ welcome }}</h3>
    <table border="1" cellpadding="8">
        <tr>
            <th>商品名称</th>
            <th>价格(元)</th>
            <th>库存状态</th>
        </tr>
        {% for product in items %}
        <tr>
            <td>{{ product.name }}</td>
            <td>{{ product.price }}</td>
            <td>
                {% if product.stock > 0 %}
                    有货({{ product.stock }} 件)
                {% else %}
                    <strong style="color: red;">缺货</strong>
                {% endif %}
            </td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

运行与验证

在项目根目录执行以下命令启动服务:

python app.py

浏览器访问 http://127.0.0.1:5000,预期页面显示:

  • 标题栏显示“商品中心”
  • 页面顶部显示“欢迎光临示例商城”
  • 表格中列出 4 条商品记录,其中“无线鼠标”因库存为 0 显示红色“缺货”,其余商品显示对应库存数量

判定标准:页面成功渲染且数据与 app.py 中定义的 products 列表完全一致,即说明 Jinja2 变量传递与循环渲染功能正常实现。

Flask + Jinja2 模板渲染流程 浏览器 GET / 显示渲染后 HTML 页面 HTTP 请求 Flask 应用 路由 / 定义数据: title / welcome products 列表 render_template() 变量传递 Jinja2 模板 index.html {{ title }} {{ welcome }} {% for product in items %} {% if product.stock > 0 %} 变量插值 + 循环 + 条件 返回完整 HTML 响应