StreamingResponse streamt nicht mit Generatorfunktion
FastAPI bietet die StreamingResponse-Klasse, um Antworten schrittweise an Clients zurückzusenden. In einigen Fällen funktioniert diese Funktionalität jedoch möglicherweise nicht wie erwartet.
Untersuchung der Grundursache
Nach der Analyse des bereitgestellten FastAPI-Codes und der Problembeschreibung haben wir das Problem identifiziert mehrere mögliche Ursachen:
1. Verwendung einer POST-Anfrage zur Datenanforderung:
Die Verwendung einer POST-Anfrage ist nicht für die Anforderung von Daten von einem Server geeignet. Stattdessen wird empfohlen, hierfür eine GET-Anfrage zu verwenden.
2. Verwendung von Abfrageparametern zur Authentifizierung:
Das Senden vertraulicher Anmeldeinformationen, wie z. B. des auth_key, über Abfrageparameter ist nicht sicher. Erwägen Sie stattdessen die Verwendung von Headern oder Cookies zur Authentifizierung.
3. Blockierende Generatorfunktion:
Die Generatorfunktion in StreamingResponse ist mit def (nicht asynchrone def) definiert, was zu Blockierungsproblemen innerhalb der FastAPI-Ereignisschleife führen kann.
4. Zeilenbasiertes Chunking:
Requests' iter_lines() iteriert zeilenweise über die Antwortdaten. Wenn in der Antwort keine Zeilenumbrüche vorhanden sind, werden die Daten nicht inkrementell gedruckt.
5. MIME-Sniffing:
Einige Browser (z. B. Chrome) puffern möglicherweise Text/einfache Antworten, um vor der Anzeige nach Klartextinhalten zu suchen. Dies kann das Streaming behindern.
Empfohlene Fehlerbehebungen:
1. GET-Anfrage verwenden:
Refaktorieren Sie den Code, um eine GET-Anfrage zum Abrufen von Daten zu verwenden.
2. Sichere Authentifizierung:
Verwenden Sie Header oder Cookies, um Authentifizierungsdaten sicher zu senden.
3. Asynchrone Generatorfunktion:
Definieren Sie die Generatorfunktion für die StreamingResponse mit asynchroner Definition. Wenn innerhalb des Generators Blockierungsvorgänge erforderlich sind, verwenden Sie einen externen Thread-Pool, um diese auszuführen.
4. Chunk-basiertes Chunking:
Verwenden Sie iter_content() anstelle von iter_lines(), um die Antwortdaten in Blöcken zu durchlaufen. Geben Sie eine geeignete Blockgröße an.
5. MIME-Sniffing deaktivieren:
Deaktivieren Sie MIME-Sniffing, indem Sie einen anderen Medientyp (z. B. application/json oder text/event-stream) für die StreamingResponse angeben oder den X-Content-Type-Options-Header auf „nosniff“ setzen.
Arbeitsbeispiel:
Der folgende Code zeigt eine funktionierende FastAPI-App mit Streaming-Funktion:
from fastapi import FastAPI, StreamingResponse import asyncio app = FastAPI() async def fake_data_streamer(): for i in range(10): yield b'some fake data\n\n' await asyncio.sleep(0.5) @app.get('/') async def main(): return StreamingResponse(fake_data_streamer(), media_type='text/event-stream')
Das obige ist der detaillierte Inhalt vonWarum funktioniert meine FastAPI StreamingResponse nicht mit einer Generatorfunktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!