Eine Response direkt zurückgeben¶
Wenn Sie eine FastAPI Pfadoperation erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein dict
, eine list
e, 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.
Eine Response
zurückgeben¶
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:
from datetime import datetime
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: datetime
description: Union[str, None] = None
app = FastAPI()
@app.put("/items/{id}")
def update_item(id: str, item: Item):
json_compatible_item_data = jsonable_encoder(item)
return JSONResponse(content=json_compatible_item_data)
Technische Details
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.
Eine benutzerdefinierte Response
zurückgeben¶
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:
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/legacy/")
def get_legacy_data():
data = """<?xml version="1.0"?>
<shampoo>
<Header>
Apply shampoo here.
</Header>
<Body>
You'll have to use soap here.
</Body>
</shampoo>
"""
return Response(content=data, media_type="application/xml")
Anmerkungen¶
Wenn Sie eine Response
direkt zurücksenden, werden deren Daten weder validiert, konvertiert (serialisiert), noch automatisch dokumentiert.
Sie können sie aber trotzdem wie unter Zusätzliche Responses in OpenAPI beschrieben dokumentieren.
In späteren Abschnitten erfahren Sie, wie Sie diese benutzerdefinierten Response
s verwenden/deklarieren und gleichzeitig über automatische Datenkonvertierung, Dokumentation, usw. verfügen.