Request Body¶
🌐 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.
Bir client'ten (örneğin bir tarayıcıdan) API'nize veri göndermeniz gerektiğinde, bunurequest body olarak gönderirsiniz.
Birrequest body, client'in API'nize gönderdiği veridir. Birresponse body ise API'nizin client'e gönderdiği veridir.
API'niz neredeyse her zaman birresponse body göndermek zorundadır. Ancak client'lerin her zamanrequest body göndermesi gerekmez; bazen sadece bir path isterler, belki birkaç query parametresiyle birlikte, ama body göndermezler.
Birrequest body tanımlamak için, tüm gücü ve avantajlarıylaPydantic modellerini kullanırsınız.
Bilgi
Veri göndermek için şunlardan birini kullanmalısınız:POST (en yaygını),PUT,DELETE veyaPATCH.
GET request'i ile body göndermek, spesifikasyonlarda tanımsız bir davranıştır; yine de FastAPI bunu yalnızca çok karmaşık/uç kullanım senaryoları için destekler.
Önerilmediği için Swagger UI ile etkileşimli dokümanlar,GET kullanırken body için dokümantasyonu göstermez ve aradaki proxy'ler bunu desteklemeyebilir.
Pydantic'inBaseModel'ini import edin¶
Önce,pydantic içindenBaseModel'i import etmeniz gerekir:
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.post("/items/")asyncdefcreate_item(item:Item):returnitemVeri modelinizi oluşturun¶
Sonra veri modelinizi,BaseModel'den kalıtım alan bir class olarak tanımlarsınız.
Tüm attribute'lar için standart Python type'larını kullanın:
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.post("/items/")asyncdefcreate_item(item:Item):returnitemQuery parametrelerini tanımlarken olduğu gibi, bir model attribute'ü default bir değere sahipse zorunlu değildir. Aksi halde zorunludur. Sadece opsiyonel yapmak içinNone kullanın.
Örneğin, yukarıdaki model şu şekilde bir JSON "object" (veya Pythondict) tanımlar:
{"name":"Foo","description":"An optional description","price":45.2,"tax":3.5}...description vetax opsiyonel olduğu için (default değerleriNone), şu JSON "object" da geçerli olur:
{"name":"Foo","price":45.2}Parametre olarak tanımlayın¶
Bunupath operation'ınıza eklemek için, path ve query parametrelerini tanımladığınız şekilde tanımlayın:
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.post("/items/")asyncdefcreate_item(item:Item):returnitem...ve type'ını, oluşturduğunuz model olanItem olarak belirtin.
Sonuçlar¶
Sadece bu Python type tanımıyla,FastAPI şunları yapar:
- Request'in body'sini JSON olarak okur.
- İlgili type'lara dönüştürür (gerekirse).
- Veriyi doğrular (validate eder).
- Veri geçersizse, tam olarak nerede ve hangi verinin hatalı olduğunu söyleyen, anlaşılır bir hata döndürür.
- Aldığı veriyi
itemparametresi içinde size verir.- Fonksiyonda bunun type'ını
Itemolarak tanımladığınız için, tüm attribute'lar ve type'ları için editor desteğini (tamamlama vb.) de alırsınız.
- Fonksiyonda bunun type'ını
- Modeliniz içinJSON Schema tanımları üretir; projeniz için anlamlıysa bunları başka yerlerde de kullanabilirsiniz.
- Bu şemalar üretilen OpenAPI şemasının bir parçası olur ve otomatik dokümantasyonUIs tarafından kullanılır.
Otomatik dokümanlar¶
Modellerinizin JSON Schema'ları, OpenAPI tarafından üretilen şemanın bir parçası olur ve etkileşimli API dokümanlarında gösterilir:

Ayrıca, ihtiyaç duyan herpath operation içindeki API dokümanlarında da kullanılır:

Editor desteği¶
Editor'ünüzde, fonksiyonunuzun içinde her yerde type hint'leri ve tamamlama (completion) alırsınız (Pydantic modeli yerinedict alsaydınız bu olmazdı):

Yanlış type işlemleri için hata kontrolleri de alırsınız:

Bu bir tesadüf değil; tüm framework bu tasarımın etrafında inşa edildi.
Ayrıca, bunun tüm editor'lerle çalışacağından emin olmak için herhangi bir implementasyon yapılmadan önce tasarım aşamasında kapsamlı şekilde test edildi.
Hatta bunu desteklemek için Pydantic'in kendisinde bile bazı değişiklikler yapıldı.
Önceki ekran görüntüleriVisual Studio Code ile alınmıştır.
AncakPyCharm ve diğer Python editor'lerinin çoğunda da aynı editor desteğini alırsınız:

İpucu
Editor olarakPyCharm kullanıyorsanız,Pydantic PyCharm Plugin kullanabilirsiniz.
Pydantic modelleri için editor desteğini şu açılardan iyileştirir:
- auto-completion
- type checks
- refactoring
- searching
- inspections
Modeli kullanın¶
Fonksiyonun içinde model nesnesinin tüm attribute'larına doğrudan erişebilirsiniz:
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.post("/items/")asyncdefcreate_item(item:Item):item_dict=item.model_dump()ifitem.taxisnotNone:price_with_tax=item.price+item.taxitem_dict.update({"price_with_tax":price_with_tax})returnitem_dictRequest body + path parametreleri¶
Path parametrelerini ve request body'yi aynı anda tanımlayabilirsiniz.
FastAPI, path parametreleriyle eşleşen fonksiyon parametrelerininpath'ten alınması gerektiğini ve Pydantic model olarak tanımlanan fonksiyon parametrelerininrequest body'den alınması gerektiğini anlayacaktır.
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item):return{"item_id":item_id,**item.model_dump()}Request body + path + query parametreleri¶
body,path vequery parametrelerini aynı anda da tanımlayabilirsiniz.
FastAPI bunların her birini tanır ve veriyi doğru yerden alır.
fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str|None=Noneprice:floattax:float|None=Noneapp=FastAPI()@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int,item:Item,q:str|None=None):result={"item_id":item_id,**item.model_dump()}ifq:result.update({"q":q})returnresultFonksiyon parametreleri şu şekilde tanınır:
- Parametre,path içinde de tanımlıysa path parametresi olarak kullanılır.
- Parametretekil bir type'taysa (
int,float,str,boolvb.),query parametresi olarak yorumlanır. - Parametre birPydantic model type'ı olarak tanımlandıysa, requestbody olarak yorumlanır.
Not
FastAPI,q değerinin zorunlu olmadığını= None default değerinden anlayacaktır.
str | None, FastAPI tarafından bu değerin zorunlu olmadığını belirlemek için kullanılmaz; FastAPI bunun zorunlu olmadığını= None default değeri olduğu için bilir.
Ancak type annotation'larını eklemek, editor'ünüzün size daha iyi destek vermesini ve hataları yakalamasını sağlar.
Pydantic olmadan¶
Pydantic modellerini kullanmak istemiyorsanız,Body parametrelerini de kullanabilirsiniz.Body - Multiple Parameters: Singular values in body dokümanına bakın.







