Heim  >  Artikel  >  Backend-Entwicklung  >  Warum funktioniert meine FastAPI StreamingResponse nicht mit einer Generatorfunktion?

Warum funktioniert meine FastAPI StreamingResponse nicht mit einer Generatorfunktion?

DDD
DDDOriginal
2024-11-08 09:51:01931Durchsuche

Why Isn't My FastAPI StreamingResponse Working with a Generator Function?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn