Eine Response direkt zurückgeben¶
🌐 Übersetzung durch KI und Menschen
Diese Übersetzung wurde von KI erstellt, angeleitet von Menschen. 🤝
Sie könnte Fehler enthalten, etwa Missverständnisse des ursprünglichen Sinns oder unnatürliche Formulierungen, usw. 🤖
Sie können diese Übersetzung verbessern, indem Sie uns helfen, die KI-LLM besser anzuleiten.
Wenn Sie eine FastAPI Pfadoperation erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein dict, eine list, ein Pydantic-Modell, ein Datenbankmodell, usw.
Wenn Sie ein Responsemodell deklarieren, wird FastAPI es verwenden, um die Daten mithilfe von Pydantic nach JSON zu serialisieren.
Wenn Sie kein Responsemodell deklarieren, verwendet FastAPI den jsonable_encoder, wie in JSON-kompatibler Encoder erläutert, und packt die Daten in eine JSONResponse.
Sie könnten auch direkt eine JSONResponse erstellen und zurückgeben.
Tipp
Normalerweise erzielen Sie eine deutlich bessere Leistung, wenn Sie ein Responsemodell verwenden, als wenn Sie direkt eine JSONResponse zurückgeben, da die Serialisierung der Daten dabei mit Pydantic in Rust erfolgt.
Eine Response zurückgeben¶
Tatsächlich können Sie jede Response oder jede Unterklasse davon zurückgeben.
Info
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.
Das bringt Ihnen aber auch viel Verantwortung. Sie müssen sicherstellen, dass die von Ihnen zurückgegebenen Daten korrekt sind, das richtige Format haben, serialisierbar sind, 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 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: 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önnten 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")
Funktionsweise eines Responsemodells¶
Wenn Sie in einer Pfadoperation ein Responsemodell - Rückgabetyp deklarieren, wird FastAPI es verwenden, um die Daten mithilfe von Pydantic nach JSON zu serialisieren.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
tags: list[str] = []
@app.post("/items/")
async def create_item(item: Item) -> Item:
return item
@app.get("/items/")
async def read_items() -> list[Item]:
return [
Item(name="Portal Gun", price=42.0),
Item(name="Plumbus", price=32.0),
]
Da dies auf der Rust-Seite geschieht, ist die Leistung deutlich besser, als wenn es mit normalem Python und der Klasse JSONResponse erfolgen würde.
Wenn Sie ein response_model oder einen Rückgabetyp verwenden, nutzt FastAPI weder den jsonable_encoder (was langsamer wäre) zur Konvertierung der Daten noch die Klasse JSONResponse.
Stattdessen nimmt es die von Pydantic mithilfe des Responsemodells (oder Rückgabetyps) generierten JSON-Bytes und gibt direkt eine Response mit dem richtigen Mediatyp für JSON (application/json) zurück.
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 Responses verwenden/deklarieren und gleichzeitig über automatische Datenkonvertierung, Dokumentation, usw. verfügen.