Ana içeriğe geç

Doğrudan Bir Response Döndürme

🌐 Translation by AI and humans

This translation was made by AI guided by humans. 🤝

It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖

You can improve this translation by helping us guide the AI LLM better.

English version

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.

Varsayılan olarak FastAPI, döndürdüğünüz bu değeri JSON Compatible Encoder bölümünde anlatılan jsonable_encoder ile otomatik olarak JSON'a çevirir.

Ardından perde arkasında, JSON-uyumlu bu veriyi (ör. bir dict) client'a response göndermek için kullanılacak bir JSONResponse içine yerleştirir.

Ancak path operation'larınızdan doğrudan bir JSONResponse döndürebilirsiniz.

Bu, örneğin özel header'lar veya cookie'ler döndürmek istediğinizde faydalı olabilir.

Bir Response Döndürme

Aslında herhangi bir Response veya onun herhangi bir alt sınıfını döndürebilirsiniz.

İpucu

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.

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)
🤓 Other versions and variants
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)

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")

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 Additional Responses in OpenAPI 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.