Flask Stream Helpers API
stream_with_context 用于在生成器函数中保持请求上下文,使流式响应中仍能访问 request、session 等对象。
stream_with_context
| 参数 | 类型 | 说明 |
|---|---|---|
| generator_or_function | iterator / callable | 生成器函数或可调用对象。作为装饰器或包装函数使用 |
两种用法
| 用法 | 说明 |
|---|---|
| 装饰器模式 | @stream_with_context 装饰生成器函数 |
| 包装模式 | stream_with_context(generator()) 包裹已创建的生成器 |
注意事项:一旦响应体开始发送,就不能再修改响应头。如果生成器中需要访问 session,必须在视图函数中先访问 session 以触发 Vary: Cookie 头的设置。
代码示例
实例
from flask import Flask, stream_with_context, request, Response
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""流式响应示例:逐行发送数据"""
@stream_with_context
def generate():
# 即使响应已开始发送,仍可访问 request
yield f"data: Hello {request.args.get('name', 'RUNOOB')}\n"
for i in range(5):
yield f"data: Line {i}\n"
yield "data: [DONE]\n"
return Response(generate(), mimetype="text/event-stream")
@app.get("/stream-wrap")
def stream_wrap():
"""包装模式"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# 使用 stream_with_context 包裹已创建的生成器
return Response(stream_with_context(generate()))
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""流式响应示例:逐行发送数据"""
@stream_with_context
def generate():
# 即使响应已开始发送,仍可访问 request
yield f"data: Hello {request.args.get('name', 'RUNOOB')}\n"
for i in range(5):
yield f"data: Line {i}\n"
yield "data: [DONE]\n"
return Response(generate(), mimetype="text/event-stream")
@app.get("/stream-wrap")
def stream_wrap():
"""包装模式"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# 使用 stream_with_context 包裹已创建的生成器
return Response(stream_with_context(generate()))
