python / expert
Snippet
Asynchrone StreamingHttpResponse mittels Generator-Ausnahmeweiterleitung
Django unterstützt asynchrone Generator-Streaming-Antworten. Die Verwendung von asyncio.CancelledError in einem asynchronen Generator ermöglicht eine saubere Ressourcenfreigabe, wenn HTTP-Clients die Verbindung vorzeitig trennen.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import asynciofrom typing import AsyncGeneratorfrom django.http import StreamingHttpResponseasync def generate_telemetry_stream() -> AsyncGenerator[str, None]:try:for step in range(5):await asyncio.sleep(0.1)yield f"event: metric\ndata: {{\"step\": {step}}}\n\n"except asyncio.CancelledError:# Clean up socket resources on client disconnectpassasync def telemetry_stream_view(request):return StreamingHttpResponse(generate_telemetry_stream(),content_type="text/event-stream")
django
Erklärung
1
async def generate_telemetry_stream() -> AsyncGenerator[str, None]:
Deklariert einen asynchronen Generator, der Datenhappen liefert, ohne die Haupt-Event-Loop zu blockieren.
2
yield f"event: metric\ndata: {{\"step\": {step}}}\n\n"
Gibt Daten im Format Server-Sent Events an den nachgelagerten Antwortstream aus.
3
except asyncio.CancelledError:
Fängt Abbruchsignale ab, die ausgelöst werden, wenn die Clientverbindung während des Streamings abbricht.