Doğrudan Bir Response Döndürme¶
🌐 Yapay Zekâ ve İnsanlar Tarafından Çeviri
Bu çeviri, insanlar tarafından yönlendirilen bir yapay zekâ ile oluşturuldu. 🤝
Orijinal anlamın yanlış anlaşılması ya da kulağa doğal gelmeme gibi hatalar içerebilir. 🤖
Yapay zekâ LLM'ini daha iyi yönlendirmemize yardımcı olarak bu çeviriyi iyileştirebilirsiniz.
FastAPI ile bir path operation oluşturduğunuzda, normalde ondan herhangi bir veri döndürebilirsiniz: bir dict, bir list, bir Pydantic model, bir veritabanı modeli vb.
Bir Response Model deklare ederseniz, FastAPI veriyi Pydantic kullanarak JSON'a serialize etmek için bunu kullanır.
Bir response model deklare etmezseniz, FastAPI JSON Uyumlu Encoder'da anlatılan jsonable_encoder'ı kullanır ve bunu bir JSONResponse içine koyar.
Ayrıca doğrudan bir JSONResponse oluşturup döndürebilirsiniz.
İpucu
Response Model kullanmak, doğrudan JSONResponse döndürmeye kıyasla genellikle çok daha iyi performans sağlar; çünkü veriyi Pydantic ile, Rust tarafında serialize eder.
Bir Response Döndürme¶
Aslında herhangi bir Response veya onun herhangi bir alt sınıfını döndürebilirsiniz.
Bilgi
JSONResponse zaten Response'un bir alt sınıfıdır.
Bir Response döndürdüğünüzde, FastAPI bunu olduğu gibi doğrudan iletir.
Pydantic model'leriyle herhangi bir veri dönüşümü yapmaz, içeriği başka bir tipe çevirmez vb.
Bu size ciddi bir esneklik sağlar. Herhangi bir veri türü döndürebilir, herhangi bir veri deklarasyonunu veya validasyonunu override edebilirsiniz.
Bu aynı zamanda size ciddi bir sorumluluk yükler. Döndürdüğünüz verinin doğru, doğru formatta, serialize edilebilir vb. olduğundan emin olmanız gerekir.
Bir Response İçinde jsonable_encoder Kullanma¶
FastAPI, sizin döndürdüğünüz Response üzerinde hiçbir değişiklik yapmadığı için, içeriğinin gönderilmeye hazır olduğundan emin olmanız gerekir.
Örneğin, bir Pydantic model'i, önce JSON-uyumlu tiplere çevrilmeden (datetime, UUID vb.) doğrudan bir JSONResponse içine koyamazsınız. Önce tüm veri tipleri JSON-uyumlu hale gelecek şekilde dict'e çevrilmesi gerekir.
Bu gibi durumlarda, response'a vermeden önce verinizi dönüştürmek için jsonable_encoder kullanabilirsiniz:
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)
Teknik Detaylar
from starlette.responses import JSONResponse da kullanabilirsiniz.
FastAPI, geliştirici olarak size kolaylık olması için starlette.responses içeriğini fastapi.responses üzerinden de sunar. Ancak mevcut response'ların çoğu doğrudan Starlette'tan gelir.
Özel Bir Response Döndürme¶
Yukarıdaki örnek ihtiyaç duyduğunuz tüm parçaları gösteriyor, ancak henüz çok kullanışlı değil. Çünkü item'ı zaten doğrudan döndürebilirdiniz ve FastAPI varsayılan olarak onu sizin için bir JSONResponse içine koyup dict'e çevirirdi vb.
Şimdi bunu kullanarak nasıl özel bir response döndürebileceğinize bakalım.
Diyelim ki XML response döndürmek istiyorsunuz.
XML içeriğinizi bir string içine koyabilir, onu bir Response içine yerleştirip döndürebilirsiniz:
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")
Bir Response Model Nasıl Çalışır¶
Bir path operation içinde Response Model - Dönüş Tipi deklare ettiğinizde, FastAPI veriyi Pydantic kullanarak JSON'a serialize etmek için bunu kullanır.
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),
]
Bu işlem Rust tarafında gerçekleştiği için, sıradan Python ve JSONResponse sınıfıyla yapılmasına kıyasla performans çok daha iyi olacaktır.
Bir response_model veya dönüş tipi kullandığınızda, FastAPI veriyi dönüştürmek için (daha yavaş olacağı için) jsonable_encoder'ı ya da JSONResponse sınıfını kullanmaz.
Bunun yerine, response model'i (veya dönüş tipini) kullanarak Pydantic ile üretilen JSON baytlarını alır ve doğrudan JSON için doğru medya tipiyle (application/json) bir Response döndürür.
Notlar¶
Bir Response'u doğrudan döndürdüğünüzde, verisi otomatik olarak validate edilmez, dönüştürülmez (serialize edilmez) veya dokümante edilmez.
Ancak yine de OpenAPI'de Ek Response'lar bölümünde anlatıldığı şekilde dokümante edebilirsiniz.
İlerleyen bölümlerde, otomatik veri dönüşümü, dokümantasyon vb. özellikleri korurken bu özel Response'ları nasıl kullanıp declare edebileceğinizi göreceksiniz.