python / expert
Snippet
Generator-Pipeline-Middleware für das Streaming von HTTP-Antwort-Chunks
Dieses Muster zeigt die Verwendung von Python-Generatorfunktionen in Django-Middleware zur Verarbeitung von StreamingHttpResponse-Inhalten. Durch Verpacken von response.streaming_content mit einem Generator werden Daten-Chunks während der Client-Übertragung in Echtzeit modifiziert, ohne den gesamten Stream im Arbeitsspeicher abzulegen.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
from typing import Callable, Iterablefrom django.http import HttpRequest, StreamingHttpResponsedef stream_transformation_middleware(get_response: Callable):def middleware(request: HttpRequest):response = get_response(request)if isinstance(response, StreamingHttpResponse):def transform(content: Iterable[bytes]):for chunk in content:yield chunk.upper()response.streaming_content = transform(response.streaming_content)return responsereturn middleware
django
Erklärung
1
from typing import Callable, Iterable
Importiert Typanmerkungen für aufrufbare Objekte und iterierbare Datenbehälter.
2
from django.http import HttpRequest, StreamingHttpResponse
Importiert HTTP-Request- und Streaming-Response-Klassen aus Django.
3
def stream_transformation_middleware(get_response: Callable):
Definiert eine Middleware-Fabrik, die ein aufrufbares View-Objekt entgegennimmt.
4
def middleware(request: HttpRequest):
Erstellt den Request-Handler-Wrapper für eingehende Anfragen.
5
response = get_response(request)
Ruft nachfolgende View-Handler auf und erhält das Antwort-Objekt.
6
if isinstance(response, StreamingHttpResponse):
Prüft, ob es sich bei der Antwort um eine StreamingHttpResponse handelt.
7
def transform(content: Iterable[bytes]):
Definiert einen inneren Generator zur Online-Verarbeitung der Chunks.
8
for chunk in content:
Iteriert über die Byte-Chunks des ursprünglichen Streams.
9
yield chunk.upper()
Transformiert Byte-Inhalte und gibt sie schrittweise aus, ohne den Gesamtspeicher zu belasten.
10
response.streaming_content = transform(response.streaming_content)
Ersetzt die Streaming-Pipeline durch den transformierenden Generator.
11
return response
Gibt die aktualisierte HTTP-Antwort in der Middleware-Kette zurück.
12
return middleware
Gibt die erstellte Middleware-Funktion zurück.