Wenn Sie eine FastAPIPfadoperation erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein dict, eine liste, ein Pydantic-Modell, ein Datenbankmodell, usw.
Standardmäßig konvertiert FastAPI diesen Rückgabewert automatisch nach JSON, mithilfe des jsonable_encoder, der in JSON-kompatibler Encoder erläutert wird.
Dann würde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein dict) in eine JSONResponse einfügen, die zum Senden der Response an den Client verwendet würde.
Sie können jedoch direkt eine JSONResponse von Ihren Pfadoperationen zurückgeben.
Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookies zurückzugeben.
Tatsächlich können Sie jede Response oder jede Unterklasse davon zurückgeben.
Tipp
JSONResponse selbst ist eine Unterklasse von Response.
Und wenn Sie eine Response zurückgeben, wird FastAPI diese direkt weiterleiten.
Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den Inhalt nicht in irgendeinen Typ konvertieren, usw.
Dadurch haben Sie viel Flexibilität. Sie können jeden Datentyp zurückgeben, jede Datendeklaration oder -validierung überschreiben, usw.
Verwendung des jsonable_encoder in einer Response¶
Da FastAPI keine Änderungen an einer von Ihnen zurückgegebenen Response vornimmt, müssen Sie sicherstellen, dass deren Inhalt dafür bereit ist.
Sie können beispielsweise kein Pydantic-Modell in eine JSONResponse einfügen, ohne es zuvor in ein dict zu konvertieren, bei dem alle Datentypen (wie datetime, UUID, usw.) in JSON-kompatible Typen konvertiert wurden.
In diesen Fällen können Sie den jsonable_encoder verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
Sie können auch from starlette.responses import JSONResponse verwenden.
FastAPI bietet dieselben starlette.responses auch via fastapi.responses an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette.
Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht sehr nützlich, da Sie das item einfach direkt hätten zurückgeben können, und FastAPI würde es für Sie in eine JSONResponse einfügen, es in ein dict konvertieren, usw. All das standardmäßig.
Sehen wir uns nun an, wie Sie damit eine benutzerdefinierte Response zurückgeben können.
Nehmen wir an, Sie möchten eine XML-Response zurückgeben.
Sie könnten Ihren XML-Inhalt als String in eine Response einfügen und sie zurückgeben:
fromfastapiimportFastAPI,Responseapp=FastAPI()@app.get("/legacy/")defget_legacy_data():data="""<?xml version="1.0"?> <shampoo> <Header> Apply shampoo here. </Header> <Body> You'll have to use soap here. </Body> </shampoo> """returnResponse(content=data,media_type="application/xml")
In späteren Abschnitten erfahren Sie, wie Sie diese benutzerdefinierten Responses verwenden/deklarieren und gleichzeitig über automatische Datenkonvertierung, Dokumentation, usw. verfügen.