Flask Stream Helpers API
stream_with_contextSe utiliza para mantener el contexto de la solicitud en funciones generadoras, de modo que objetos como request y session sigan siendo accesibles durante la respuesta de streaming.
stream_with_context
| Parámetros | Tipo | Descripción |
|---|---|---|
| generator_or_function | iterator / callable | Función generadora u objeto invocable. Se utiliza como decorador o función envoltorio. |
Dos usos
| Uso | Descripción |
|---|---|
| Modo decorador | @stream_with_context decora la función generadora |
| Modo envoltorio | stream_with_context(generator()) envuelve el generador ya creado |
Consideraciones:Una vez que el cuerpo de la respuesta comienza a enviarse, ya no se pueden modificar los encabezados de respuesta. Si necesita acceder a session en el generador, debe acceder primero a session en la función de vista para activar la configuración del encabezado Vary: Cookie.
Ejemplo de código
Ejemplo
from flask import Flask, stream_with_context, request, Response
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""Ejemplo de respuesta de streaming: enviar datos línea por línea"""
@stream_with_context
def generate():
# Incluso después de que la respuesta haya comenzado a enviarse, aún se puede acceder a request
yield f"data: Hello {request.args.get('name', 'EJEMPLO')}\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():
"""Modo envoltorio"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# Usar stream_with_context para envolver el generador ya creado
return Response(stream_with_context(generate()))
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""Ejemplo de respuesta de streaming: enviar datos línea por línea"""
@stream_with_context
def generate():
# Incluso después de que la respuesta haya comenzado a enviarse, aún se puede acceder a request
yield f"data: Hello {request.args.get('name', 'EJEMPLO')}\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():
"""Modo envoltorio"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# Usar stream_with_context para envolver el generador ya creado
return Response(stream_with_context(generate()))