Bağımlılıklar¶
🌐 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, çok güçlü ama aynı zamanda sezgisel birBağımlılık Enjeksiyonu sistemine sahiptir.
Kullanımı çok basit olacak şekilde tasarlanmıştır ve herhangi bir geliştiricinin diğer bileşenleriFastAPI ile entegre etmesini kolaylaştırır.
"Dependency Injection" Nedir?¶
Programlamada"Dependency Injection", kodunuzun (bu örnektepath operation function'larınızın) çalışmak ve kullanmak için ihtiyaç duyduğu şeyleri: "dependencies" (bağımlılıklar) olarak beyan edebilmesi anlamına gelir.
Ardından bu sistem (bu örnekteFastAPI), kodunuza gerekli bağımlılıkları sağlamak ("inject" etmek) için gereken her şeyi sizin yerinize halleder.
Bu yaklaşım, şunlara ihtiyaç duyduğunuzda özellikle faydalıdır:
- Paylaşılan bir mantığa sahip olmak (aynı kod mantığını tekrar tekrar kullanmak).
- Veritabanı bağlantılarını paylaşmak.
- Güvenlik, authentication, rol gereksinimleri vb. kuralları zorunlu kılmak.
- Ve daha birçok şey...
Tüm bunları, kod tekrarını minimumda tutarak yaparsınız.
İlk Adımlar¶
Çok basit bir örneğe bakalım. Şimdilik o kadar basit olacak ki pek işe yaramayacak.
Ama bu sayedeDependency Injection sisteminin nasıl çalıştığına odaklanabiliriz.
Bir dependency (bağımlılık) veya "dependable" Oluşturun¶
Önce dependency'e odaklanalım.
Bu, birpath operation function'ın alabileceği parametrelerin aynısını alabilen basit bir fonksiyondur:
fromtypingimportAnnotatedfromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:Annotated[dict,Depends(common_parameters)]):returncommons@app.get("/users/")asyncdefread_users(commons:Annotated[dict,Depends(common_parameters)]):returncommons🤓 Other versions and variants
Tip
Prefer to use theAnnotated version if possible.
fromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:dict=Depends(common_parameters)):returncommons@app.get("/users/")asyncdefread_users(commons:dict=Depends(common_parameters)):returncommonsBu kadar.
2 satır.
Ve tümpath operation function'larınızla aynı şekle ve yapıya sahiptir.
Bunu, "decorator" olmadan (yani@app.get("/some-path") olmadan) yazılmış birpath operation function gibi düşünebilirsiniz.
Ayrıca istediğiniz herhangi bir şeyi döndürebilir.
Bu örnekte, bu dependency şunları bekler:
strolan, opsiyonel bir query parametresiq.intolan, opsiyonel bir query parametresiskipve varsayılanı0.intolan, opsiyonel bir query parametresilimitve varsayılanı100.
Sonra da bu değerleri içeren birdict döndürür.
Bilgi
FastAPI,Annotated desteğini 0.95.0 sürümünde ekledi (ve önermeye başladı).
Daha eski bir sürüm kullanıyorsanızAnnotated kullanmaya çalıştığınızda hata alırsınız.
Annotated kullanmadan önceFastAPI sürümünü en az 0.95.1'e yükseltmek içinFastAPI sürümünü yükseltin.
Depends'i Import Edin¶
fromtypingimportAnnotatedfromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:Annotated[dict,Depends(common_parameters)]):returncommons@app.get("/users/")asyncdefread_users(commons:Annotated[dict,Depends(common_parameters)]):returncommons🤓 Other versions and variants
Tip
Prefer to use theAnnotated version if possible.
fromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:dict=Depends(common_parameters)):returncommons@app.get("/users/")asyncdefread_users(commons:dict=Depends(common_parameters)):returncommons"Dependant" İçinde Dependency'yi Tanımlayın¶
Path operation function parametrelerinizdeBody,Query vb. kullandığınız gibi, yeni bir parametreyleDepends kullanın:
fromtypingimportAnnotatedfromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:Annotated[dict,Depends(common_parameters)]):returncommons@app.get("/users/")asyncdefread_users(commons:Annotated[dict,Depends(common_parameters)]):returncommons🤓 Other versions and variants
Tip
Prefer to use theAnnotated version if possible.
fromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:dict=Depends(common_parameters)):returncommons@app.get("/users/")asyncdefread_users(commons:dict=Depends(common_parameters)):returncommonsFonksiyon parametrelerindeDepends'iBody,Query vb. ile aynı şekilde kullansanız daDepends biraz farklı çalışır.
Depends'e yalnızca tek bir parametre verirsiniz.
Bu parametre, bir fonksiyon gibi bir şey olmalıdır.
Onu doğrudançağırmazsınız (sonuna parantez eklemezsiniz), sadeceDepends()'e parametre olarak verirsiniz.
Ve bu fonksiyon da,path operation function'lar gibi parametre alır.
İpucu
Fonksiyonların dışında başka hangi "şeylerin" dependency olarak kullanılabildiğini bir sonraki bölümde göreceksiniz.
Yeni bir request geldiğinde,FastAPI şunları sizin yerinize yapar:
- Dependency ("dependable") fonksiyonunuzu doğru parametrelerle çağırır.
- Fonksiyonunuzun sonucunu alır.
- Bu sonucupath operation function'ınızdaki parametreye atar.
graph TBcommon_parameters(["common_parameters"])read_items["/items/"]read_users["/users/"]common_parameters --> read_itemscommon_parameters --> read_usersBu şekilde paylaşılan kodu bir kez yazarsınız ve onupath operation'larda çağırma işiniFastAPI halleder.
Ek bilgi
Dikkat edin: Bunu "register" etmek ya da benzeri bir şey yapmak için özel bir class oluşturupFastAPI'ye bir yere geçirmeniz gerekmez.
SadeceDepends'e verirsiniz ve gerisiniFastAPI nasıl yapacağını bilir.
Annotated Dependency'lerini Paylaşın¶
Yukarıdaki örneklerde, ufak birkod tekrarı olduğunu görüyorsunuz.
common_parameters() dependency'sini kullanmanız gerektiğinde, type annotation veDepends() içeren parametrenin tamamını yazmanız gerekir:
commons:Annotated[dict,Depends(common_parameters)]AncakAnnotated kullandığımız için buAnnotated değerini bir değişkende saklayıp birden fazla yerde kullanabiliriz:
fromtypingimportAnnotatedfromfastapiimportDepends,FastAPIapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}CommonsDep=Annotated[dict,Depends(common_parameters)]@app.get("/items/")asyncdefread_items(commons:CommonsDep):returncommons@app.get("/users/")asyncdefread_users(commons:CommonsDep):returncommonsİpucu
Bu aslında standart Python'dır; buna "type alias" denir veFastAPI'ye özel bir şey değildir.
AmaFastAPI,Annotated dahil Python standartları üzerine kurulu olduğu için bu tekniği kodunuzda kullanabilirsiniz. 😎
Dependency'ler beklediğiniz gibi çalışmaya devam eder veen güzel kısmı da şudur:type bilgisi korunur. Bu da editörünüzün sizeautocompletion,inline errors vb. sağlamaya devam edeceği anlamına gelir.mypy gibi diğer araçlar için de aynısı geçerlidir.
Bu özellikle,büyük bir kod tabanında, aynı dependency'leribirçokpath operation içinde tekrar tekrar kullandığınızda çok faydalı olacaktır.
async Olsa da Olmasa da¶
Dependency'ler deFastAPI tarafından çağrılacağı için (tıpkıpath operation function'larınız gibi), fonksiyonları tanımlarken aynı kurallar geçerlidir.
async def ya da normaldef kullanabilirsiniz.
Ayrıca normaldefpath operation function'ları içindeasync def dependency tanımlayabilir veyaasync defpath operation function'ları içindedef dependency kullanabilirsiniz vb.
Fark etmez.FastAPI ne yapacağını bilir.
Not
Eğer bilmiyorsanız, dokümanlardaasync veawait içinAsync:"In a hurry?" bölümüne bakın.
OpenAPI ile Entegre¶
Dependency'lerinizin (ve alt dependency'lerin) tüm request tanımları, doğrulamaları ve gereksinimleri aynı OpenAPI şemasına entegre edilir.
Bu nedenle interaktif dokümanlar, bu dependency'lerden gelen tüm bilgileri de içerir:

Basit Kullanım¶
Şöyle düşünürseniz:Path operation function'lar, birpath veoperation eşleştiğinde kullanılacak şekilde tanımlanır; ardındanFastAPI fonksiyonu doğru parametrelerle çağırır ve request'ten veriyi çıkarır.
Aslında tüm (veya çoğu) web framework'ü de aynı şekilde çalışır.
Bu fonksiyonları hiçbir zaman doğrudan çağırmazsınız. Onları framework'ünüz (bu örnekteFastAPI) çağırır.
Dependency Injection sistemiyle,path operation function'ınızın, ondan önce çalıştırılması gereken başka bir şeye de "bağlı" olduğunuFastAPI'ye söyleyebilirsiniz;FastAPI bunu çalıştırır ve sonuçları "inject" eder.
Aynı "dependency injection" fikri için kullanılan diğer yaygın terimler:
- resources
- providers
- services
- injectables
- components
FastAPI Plug-in'leri¶
Entegrasyonlar ve "plug-in"lerDependency Injection sistemi kullanılarak inşa edilebilir. Ancak aslında"plug-in" oluşturmanıza gerek yoktur; çünkü dependency'leri kullanarakpath operation function'larınıza sunulabilecek sınırsız sayıda entegrasyon ve etkileşim tanımlayabilirsiniz.
Dependency'ler, çok basit ve sezgisel bir şekilde oluşturulabilir. Böylece ihtiyacınız olan Python package'larını import edip, API fonksiyonlarınızla birkaç satır kodlakelimenin tam anlamıyla entegre edebilirsiniz.
İlerleyen bölümlerde ilişkisel ve NoSQL veritabanları, güvenlik vb. konularda bunun örneklerini göreceksiniz.
FastAPI Uyumluluğu¶
Dependency injection sisteminin sadeliği,FastAPI'yi şunlarla uyumlu hale getirir:
- tüm ilişkisel veritabanları
- NoSQL veritabanları
- harici paketler
- harici API'ler
- authentication ve authorization sistemleri
- API kullanım izleme (monitoring) sistemleri
- response verisi injection sistemleri
- vb.
Basit ve Güçlü¶
Hiyerarşik dependency injection sistemi tanımlamak ve kullanmak çok basit olsa da, hâlâ oldukça güçlüdür.
Kendileri de dependency tanımlayabilen dependency'ler tanımlayabilirsiniz.
Sonuçta hiyerarşik bir dependency ağacı oluşur veDependency Injection sistemi tüm bu dependency'leri (ve alt dependency'lerini) sizin için çözer ve her adımda sonuçları sağlar ("inject" eder).
Örneğin, 4 API endpoint'iniz (path operation) olduğunu varsayalım:
/items/public//items/private//users/{user_id}/activate/items/pro/
O zaman her biri için farklı izin gereksinimlerini yalnızca dependency'ler ve alt dependency'lerle ekleyebilirsiniz:
graph TBcurrent_user(["current_user"])active_user(["active_user"])admin_user(["admin_user"])paying_user(["paying_user"])public["/items/public/"]private["/items/private/"]activate_user["/users/{user_id}/activate"]pro_items["/items/pro/"]current_user --> active_useractive_user --> admin_useractive_user --> paying_usercurrent_user --> publicactive_user --> privateadmin_user --> activate_userpaying_user --> pro_itemsOpenAPI ile Entegre¶
Bu dependency'lerin tümü, gereksinimlerini beyan ederken aynı zamandapath operation'larınıza parametreler, doğrulamalar vb. da ekler.
FastAPI, bunların hepsini OpenAPI şemasına eklemekle ilgilenir; böylece interaktif dokümantasyon sistemlerinde gösterilir.







