API des utilitaires de flux Flask
stream_with_contextUtilisé pour maintenir le contexte de la requête dans les fonctions génératrices, afin que des objets tels que request et session restent accessibles pendant les réponses en streaming.
stream_with_context
| Paramètre | Type | Description |
|---|---|---|
| generator_or_function | itérateur / appelable | Une fonction génératrice ou un objet appelable. Utilisé comme décorateur ou fonction d'encapsulation. |
Deux modes d'utilisation
| Utilisation | Description |
|---|---|
| Mode Décorateur | @stream_with_context décore la fonction génératrice |
| Mode enveloppe | stream_with_context(generator()) enveloppe un générateur déjà créé |
Notes: Une fois que le corps de la réponse a commencé à être envoyé, les en-têtes de réponse ne peuvent plus être modifiés. Si le générateur doit accéder à la session, vous devez d'abord accéder à la session dans la fonction de vue pour déclencher la définition de l'en-tête Vary: Cookie.
Exemples de code
Exemple
from flask import Flask, stream_with_context, request, Response
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""Exemple de réponse en streaming : envoyer les données ligne par ligne"""
@stream_with_context
def generate():
# Même après que la réponse a commencé à être envoyée, request peut toujours être accessible
yield f"data: Hello {request.args.get('name', 'EXAMPLE')}\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():
"""Mode wrapper"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# Utiliser stream_with_context pour envelopper le générateur qui a déjà été créé
return Response(stream_with_context(generate()))
app = Flask(__name__)
@app.get("/stream")
def streamed_response():
"""Exemple de réponse en streaming : envoyer les données ligne par ligne"""
@stream_with_context
def generate():
# Même après que la réponse a commencé à être envoyée, request peut toujours être accessible
yield f"data: Hello {request.args.get('name', 'EXAMPLE')}\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():
"""Mode wrapper"""
def generate():
yield "Hello "
yield request.args.get("name", "World")
yield "!"
# Utiliser stream_with_context pour envelopper le générateur qui a déjà été créé
return Response(stream_with_context(generate()))