You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask实现模板流式渲染的技术咨询(附代码示例)

Flask模板流式渲染实现方案

嘿,这里给你整理好了Flask模板流式渲染的完整实现方案,这玩意儿在处理大页面或者需要实时输出内容的时候超实用:

后端核心代码(app.py)

from flask import Flask, Response

app = Flask(__name__)

def stream_template(template_name, **context):
    # 更新模板上下文,确保request、session这类全局变量能被模板正常访问
    app.update_template_context(context)
    # 获取指定的Jinja2模板实例
    t = app.jinja_env.get_template(template_name)
    # 生成模板的流式渲染迭代器,而不是一次性渲染整个模板
    rv = t.stream(context)
    # 开启缓冲,每积累5个输出块再发送,平衡传输效率和实时性
    rv.enable_buffering(5)
    return rv

def iter_all_rows():
    # 这里模拟从数据源逐行获取数据的生成器
    # 实际场景可以替换成数据库分页查询、读取大文件、实时日志等逻辑
    for i in range(100):
        yield f"第{i+1}条加载完成的数据内容"

@app.route('/my-large-page')
def render_large_template():
    rows = iter_all_rows()
    # 用Response包装流式渲染对象,Flask会自动处理逐块输出到客户端
    return Response(stream_template('the_template.html', rows=rows))

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

关键逻辑说明

  • stream_template是实现流式渲染的核心:它借助Jinja2的stream()方法,把模板渲染拆分成一个个可迭代的输出块,而不是一次性生成完整的HTML字符串。
  • enable_buffering(5)设置了缓冲大小,避免频繁发送极小的数据块,同时保证内容能尽快输出到浏览器,让用户看到加载进度。
  • iter_all_rows是数据源生成器,只要你的数据来源是可迭代的(比如数据库查询的生成器、文件行迭代器),就能无缝对接这个流式渲染逻辑。

前端模板文件(the_template.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>流式加载大页面</title>
</head>
<body>
    <h1>页面内容正在逐步加载...</h1>
    {% for row in rows %}
        <p>{{ row }}</p>
    {% endfor %}
</body>
</html>

模板说明

模板里的{% for row in rows %}会逐次迭代生成器里的内容,每迭代一次就输出对应的HTML片段,浏览器会实时渲染这些新内容,用户不用等整个页面加载完就能看到部分内容。

内容的提问来源于stack exchange,提问作者severinsimmler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:01:13