FastAPI StreamingResponse schlägt beim Streamen mit Generatorfunktion fehl
StreamingResponse von FastAPI ist eine bequeme Möglichkeit, Daten inkrementell, aber gelegentlich auch, an einen Client zurückzusenden verhält sich möglicherweise nicht wie erwartet, insbesondere bei Verwendung von Generatorfunktionen. Hier befassen wir uns mit den möglichen Ursachen und ihren jeweiligen Lösungen.
Häufige Ursachen und Lösungen:
1. Falsche HTTP-Methode und falsche Verarbeitung von Anmeldeinformationen:
Vermeiden Sie die Verwendung von POST-Anfragen zum Datenabruf. Entscheiden Sie sich stattdessen für GET-Anfragen. Außerdem wird dringend empfohlen, Header oder Cookies für Anmeldeinformationen anstelle von Abfrageparametern zu verwenden, um die Sicherheit zu erhöhen und eine Verschmutzung der URL-Parameter zu vermeiden.
2. Blockierungsvorgänge innerhalb der Generatorfunktion:
Wenn Ihre Generatorfunktion das Blockieren von E/A- oder CPU-intensiven Vorgängen umfasst, verwenden Sie def anstelle von async def, um potenzielle Deadlocks und Unterbrechungen der Ereignisschleife zu verhindern. Wenn Sie async def verwenden, führen Sie alternativ Blockierungsvorgänge in einem separaten ThreadPool oder ProcessPool aus.
3. Unvollständige Zeilenumbrüche:
Wenn Sie iter_lines() von Anfragen zum Durchlaufen von Antwortdaten verwenden, beachten Sie, dass die Antworten Zeile für Zeile gelesen werden. Um sicherzustellen, dass die Daten bei ihrem Eintreffen angezeigt werden, ändern Sie entweder Ihre Antwort so, dass sie Zeilenumbrüche enthält, oder verwenden Sie iter_content() mit einer angegebenen Blockgröße.
4. Medientyp- und MIME-Sniffing:
Browser können Text-/einfache Antworten puffern, um den Inhaltstyp zu erkennen. Um dies zu umgehen, verwenden Sie einen anderen Medientyp (z. B. application/json oder text/event-stream) oder deaktivieren Sie MIME-Sniffing, indem Sie den X-Content-Type-Options-Header auf nosniff setzen.
Beispiel Lösung:
Unten finden Sie eine funktionierende Implementierung einer FastAPI-App, die gefälschte Daten streamt und die genannten Probleme behebt:
from fastapi import FastAPI from fastapi.responses import 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(): headers = {'X-Content-Type-Options': 'nosniff'} return StreamingResponse(fake_data_streamer(), headers=headers, media_type='text/plain')
Beachten Sie, dass die Handhabung von Streaming-Antworten je nach variieren kann der Client (Webbrowser, HTTP-Clients usw.) und ihre jeweiligen Funktionalitäten.
Das obige ist der detaillierte Inhalt vonWarum kann meine FastAPI StreamingResponse nicht mit einer Generatorfunktion streamen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!