python / intermediate
Snippet
Streaming von Event-Daten in asynchronen Django-Views
Django unterstützt asynchrone View-Funktionen und Streaming-Antworten. Das Ausgeben von Inhalten aus einem asynchronen Generator mit StreamingHttpResponse ermöglicht Server-Sent Events (SSE) oder langlaufendes Datenstreaming ohne Server-Threads zu blockieren.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import asynciofrom typing import AsyncGeneratorfrom django.http import StreamingHttpResponse, HttpRequestasync def event_stream_generator() -> AsyncGenerator[str, None]:for i in range(1, 6):await asyncio.sleep(1)yield f"data: {{'event_id': {i}, 'status': 'processing'}}\n\n"async def async_event_stream(request: HttpRequest) -> StreamingHttpResponse:return StreamingHttpResponse(event_stream_generator(),content_type="text/event-stream")
django
Erklärung
1
async def event_stream_generator() -> AsyncGenerator[str, None]:
Definiert eine asynchrone Generator-Funktion, die Datenhäppchen nacheinander zurückgibt.
2
await asyncio.sleep(1)
Pausiert die Ausführung asynchron, ohne den Haupt-Event-Loop zu blockieren.
3
yield f"data: {{'event_id': {i}, 'status': 'processing'}}\n\n"
Gibt ein als Server-Sent Event formatiertes Datenpaket an den Client aus.
4
return StreamingHttpResponse(
Gibt eine Django-Streaming-Antwort zurück, die den asynchronen Generator Stück für Stück verarbeitet.
5
content_type="text/event-stream"
Setzt den HTTP-Header, der für Server-Sent Events im Browser erforderlich ist.