diff --git a/docs/tr/docs/advanced/advanced-python-types.md b/docs/tr/docs/advanced/advanced-python-types.md index 91fe1d5e09..3bb205bf58 100644 --- a/docs/tr/docs/advanced/advanced-python-types.md +++ b/docs/tr/docs/advanced/advanced-python-types.md @@ -13,17 +13,17 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` `typing`, bir şeyin `None` olabileceğini belirtmek için `Optional` ile bir kısayol da sunar. -Benim oldukça öznel bakış açıma göre küçük bir ipucu: +Benim oldukça **öznel** bakış açıma göre küçük bir ipucu: - 🚨 `Optional[SomeType]` kullanmaktan kaçının - Bunun yerine ✨ **`Union[SomeType, None]` kullanın** ✨. -İkisi de eşdeğer ve temelde aynıdır; ancak "**optional**" kelimesi değerin isteğe bağlı olduğunu ima eder. Oysa aslında " `None` olabilir" demektir; değer isteğe bağlı olmasa ve hâlâ zorunlu olsa bile. +İkisi de eşdeğer ve temelde aynıdır; ancak `Optional` yerine `Union` kullanmanızı öneririm, çünkü "**optional**" kelimesi değerin isteğe bağlı olduğunu ima eder. Oysa aslında "`None` olabilir" demektir; değer isteğe bağlı olmasa ve hâlâ zorunlu olsa bile. Bence `Union[SomeType, None]` ne demek istediğini daha açık anlatır. @@ -39,13 +39,13 @@ def say_hi(name: Optional[str]): print(f"Hey {name}!") ``` -`name` parametresi `Optional[str]` olarak tanımlıdır; ancak isteğe bağlı değildir, parametre olmadan fonksiyonu çağıramazsınız: +`name` parametresi `Optional[str]` olarak tanımlıdır; ancak **isteğe bağlı değildir**, parametre olmadan fonksiyonu çağıramazsınız: ```Python say_hi() # Ah hayır, bu hata fırlatır! 😱 ``` -`name` parametresi varsayılan bir değeri olmadığı için hâlâ zorunludur (yani *optional* değildir). Yine de `name`, değer olarak `None` kabul eder: +`name` parametresi varsayılan bir değeri olmadığı için **hâlâ zorunludur** (yani *optional* değildir). Yine de `name`, değer olarak `None` kabul eder: ```Python say_hi(name=None) # Bu çalışır, None geçerlidir 🎉 diff --git a/docs/tr/docs/advanced/async-tests.md b/docs/tr/docs/advanced/async-tests.md index 8633d7607e..25e177065a 100644 --- a/docs/tr/docs/advanced/async-tests.md +++ b/docs/tr/docs/advanced/async-tests.md @@ -14,7 +14,7 @@ Testlerimizde asenkron fonksiyonlar çağırmak istiyorsak, test fonksiyonlarım **FastAPI** uygulamanız `async def` yerine normal `def` fonksiyonları kullanıyor olsa bile, altta yatan yapı hâlâ bir `async` uygulamadır. -`TestClient`, standart pytest kullanarak normal `def` test fonksiyonlarınızın içinden asenkron FastAPI uygulamasını çağırmak için içeride bazı “sihirli” işlemler yapar. Ancak bu sihir, onu asenkron fonksiyonların içinde kullandığımızda artık çalışmaz. Testlerimizi asenkron çalıştırdığımızda, test fonksiyonlarımızın içinde `TestClient` kullanamayız. +`TestClient`, standart pytest kullanarak normal `def` test fonksiyonlarınızın içinden asenkron FastAPI uygulamasını çağırmak için içeride bazı "sihirli" işlemler yapar. Ancak bu sihir, onu asenkron fonksiyonların içinde kullandığımızda artık çalışmaz. Testlerimizi asenkron çalıştırdığımızda, test fonksiyonlarımızın içinde `TestClient` kullanamayız. `TestClient`, [HTTPX](https://www.python-httpx.org) tabanlıdır ve neyse ki API'yi test etmek için HTTPX'i doğrudan kullanabiliriz. @@ -71,7 +71,7 @@ Ardından app ile bir `AsyncClient` oluşturup `await` kullanarak ona async requ Bu, şu kullanıma denktir: ```Python -response = client.get('/') +response = client.get("/") ``` ...ki daha önce request'leri `TestClient` ile bu şekilde gönderiyorduk. diff --git a/docs/tr/docs/advanced/behind-a-proxy.md b/docs/tr/docs/advanced/behind-a-proxy.md index c49164e575..b9e68d22aa 100644 --- a/docs/tr/docs/advanced/behind-a-proxy.md +++ b/docs/tr/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ Bu proxy'ler HTTPS sertifikalarını ve diğer bazı işleri üstlenebilir. Uygulamanızın önündeki bir **proxy**, request'leri **server**'ınıza göndermeden önce genelde bazı header'ları dinamik olarak ayarlar. Böylece server, request'in proxy tarafından **forward** edildiğini; domain dahil orijinal (public) URL'yi, HTTPS kullanıldığını vb. bilgileri anlayabilir. -**Server** programı (örneğin **FastAPI CLI** üzerinden **Uvicorn**) bu header'ları yorumlayabilir ve ardından bu bilgiyi uygulamanıza aktarabilir. +`fastapi run` ile başlatılan **server** bu header'ları yorumlayabilir ve ardından bu bilgiyi uygulamanıza aktarabilir. Ancak güvenlik nedeniyle, server güvenilir bir proxy arkasında olduğunu bilmediği için bu header'ları yorumlamaz. @@ -34,8 +34,6 @@ Bunu `--forwarded-allow-ips="*"` olarak ayarlarsanız, gelen tüm IP'lere güven ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ Bu header'lar, aksi halde kaybolacak olan orijinal request bilgilerini korur: Uygulamanıza bir path prefix ekleyen bir proxy'niz olabilir. -Bu durumlarda uygulamanızı yapılandırmak için `root_path` kullanabilirsiniz. +Bu durumlarda server'ı `fastapi run --root-path` ile yapılandırabilirsiniz. `root_path`, FastAPI'nin (Starlette üzerinden) üzerine kurulduğu ASGI spesifikasyonunun sağladığı bir mekanizmadır. @@ -117,7 +115,7 @@ Kodunuzun tamamı sadece `/app` varmış gibi yazılmış olsa bile. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -Proxy, request'i app server'a (muhtemelen FastAPI CLI üzerinden Uvicorn) iletmeden önce **path prefix**'i anlık olarak **"kırpar"** (strip). Böylece uygulamanız hâlâ `/app` altında servis ediliyormuş gibi davranır ve tüm kodunuzu `/api/v1` prefix'ini içerecek şekilde güncellemeniz gerekmez. +Proxy, request'i server'a iletmeden önce **path prefix**'i anlık olarak **"kırpar"** (strip). Böylece uygulamanız hâlâ `/app` altında servis ediliyormuş gibi davranır ve tüm kodunuzu `/api/v1` prefix'ini içerecek şekilde güncellemeniz gerekmez. Buraya kadar her şey normal çalışır. @@ -161,7 +159,7 @@ Docs UI'nin, bu API `server`'ının (proxy arkasında) `/api/v1` altında bulund } ``` -Bu örnekte "Proxy", **Traefik** gibi bir şey olabilir. Server da FastAPI uygulamanızı çalıştıran (Uvicorn'lu) FastAPI CLI olabilir. +Bu örnekte "Proxy", **Traefik** gibi bir şey olabilir. `fastapi run` ise FastAPI uygulamanızı çalıştıran server'ı başlatır. ### `root_path` Sağlama { #providing-the-root-path } @@ -171,14 +169,10 @@ Bunu yapmak için `--root-path` komut satırı seçeneğini şöyle kullanabilir ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -Hypercorn kullanıyorsanız, onda da `--root-path` seçeneği vardır. - /// note | Teknik Detaylar ASGI spesifikasyonu bu kullanım senaryosu için bir `root_path` tanımlar. @@ -195,14 +189,12 @@ Burada sadece göstermek için bunu mesaja dahil ediyoruz. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -Ardından Uvicorn'u şu şekilde başlatırsanız: +Ardından server'ı şu şekilde başlatırsanız:
@@ -34,18 +34,20 @@ Kullanıcı adı ve şifrenin doğru olup olmadığını kontrol etmek için bir
Bunun için kullanıcı adı ve şifreyi kontrol ederken Python standart modülü olan [`secrets`](https://docs.python.org/3/library/secrets.html)'i kullanın.
-`secrets.compare_digest()`; `bytes` ya da yalnızca ASCII karakterleri (İngilizce’deki karakterler) içeren bir `str` almalıdır. Bu da `Sebastián` içindeki `á` gibi karakterlerle çalışmayacağı anlamına gelir.
+`secrets.compare_digest()`; `bytes` ya da yalnızca ASCII karakterleri (İngilizce'deki karakterler) içeren bir `str` almalıdır. Bu da `Sebastián` içindeki `á` gibi karakterlerle çalışmayacağı anlamına gelir.
-Bunu yönetmek için önce `username` ve `password` değerlerini UTF-8 ile encode ederek `bytes`’a dönüştürürüz.
+Bunu yönetmek için önce `username` ve `password` değerlerini UTF-8 ile encode ederek `bytes`'a dönüştürürüz.
-Sonra `secrets.compare_digest()` kullanarak `credentials.username`’in `"stanleyjobson"` ve `credentials.password`’ün `"swordfish"` olduğundan emin olabiliriz.
+Sonra `secrets.compare_digest()` kullanarak `credentials.username`'in `"stanleyjobson"` ve `credentials.password`'ün `"swordfish"` olduğundan emin olabiliriz.
{* ../../docs_src/security/tutorial007_an_py310.py hl[1,12:24] *}
Bu, kabaca şuna benzer olurdu:
```Python
-if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
+if not (credentials.username == "stanleyjobson") or not (
+ credentials.password == "swordfish"
+):
# Bir hata döndür
...
```
@@ -67,7 +69,7 @@ if "johndoe" == "stanleyjobson" and "love123" == "swordfish":
...
```
-Ancak Python, `johndoe` içindeki ilk `j` ile `stanleyjobson` içindeki ilk `s`’i karşılaştırdığı anda `False` döndürür; çünkü iki string’in aynı olmadığını zaten anlar ve "kalan harfleri karşılaştırmak için daha fazla hesaplama yapmaya gerek yok" diye düşünür. Uygulamanız da "Incorrect username or password" der.
+Ancak Python, `johndoe` içindeki ilk `j` ile `stanleyjobson` içindeki ilk `s`'i karşılaştırdığı anda `False` döndürür; çünkü iki string'in aynı olmadığını zaten anlar ve "kalan harfleri karşılaştırmak için daha fazla hesaplama yapmaya gerek yok" diye düşünür. Uygulamanız da "Incorrect username or password" der.
Sonra saldırganlar bu sefer `stanleyjobsox` kullanıcı adı ve `love123` şifresi ile dener.
@@ -78,13 +80,13 @@ if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
...
```
-Bu kez Python, iki string’in aynı olmadığını fark etmeden önce hem `stanleyjobsox` hem de `stanleyjobson` içinde `stanleyjobso` kısmının tamamını karşılaştırmak zorunda kalır. Bu nedenle "Incorrect username or password" yanıtını vermesi birkaç mikro saniye daha uzun sürer.
+Bu kez Python, iki string'in aynı olmadığını fark etmeden önce hem `stanleyjobsox` hem de `stanleyjobson` içinde `stanleyjobso` kısmının tamamını karşılaştırmak zorunda kalır. Bu nedenle "Incorrect username or password" yanıtını vermesi birkaç mikro saniye daha uzun sürer.
#### Yanıt süresi saldırganlara yardımcı olur { #the-time-to-answer-helps-the-attackers }
-Bu noktada saldırganlar, server’ın "Incorrect username or password" response’unu göndermesinin birkaç mikro saniye daha uzun sürdüğünü fark ederek _bir şeyleri_ doğru yaptıklarını anlar; yani başlangıçtaki bazı harfler doğrudur.
+Bu noktada saldırganlar, server'ın "Incorrect username or password" response'unu göndermesinin birkaç mikro saniye daha uzun sürdüğünü fark ederek _bir şeyleri_ doğru yaptıklarını anlar; yani başlangıçtaki bazı harfler doğrudur.
-Sonra tekrar denerken, bunun `johndoe`’dan ziyade `stanleyjobsox`’a daha yakın bir şey olması gerektiğini bilerek devam edebilirler.
+Sonra tekrar denerken, bunun `johndoe`'dan ziyade `stanleyjobsox`'a daha yakın bir şey olması gerektiğini bilerek devam edebilirler.
#### "Profesyonel" bir saldırı { #a-professional-attack }
@@ -96,12 +98,12 @@ Böylece birkaç dakika ya da birkaç saat içinde doğru kullanıcı adı ve ş
Ancak bizim kodumuzda `secrets.compare_digest()` kullanıyoruz.
-Kısacası, `stanleyjobsox` ile `stanleyjobson`’u karşılaştırmak için geçen süre, `johndoe` ile `stanleyjobson`’u karşılaştırmak için geçen süreyle aynı olur. Şifre için de aynı şekilde.
+Kısacası, `stanleyjobsox` ile `stanleyjobson`'u karşılaştırmak için geçen süre, `johndoe` ile `stanleyjobson`'u karşılaştırmak için geçen süreyle aynı olur. Şifre için de aynı şekilde.
Bu sayede uygulama kodunuzda `secrets.compare_digest()` kullanarak bu güvenlik saldırıları ailesine karşı güvenli olursunuz.
### Hatayı döndürün { #return-the-error }
-Credential’ların hatalı olduğunu tespit ettikten sonra, 401 status code ile (credential verilmediğinde dönenle aynı) bir `HTTPException` döndürün ve tarayıcının giriş penceresini yeniden göstermesi için `WWW-Authenticate` header’ını ekleyin:
+Credential'ların hatalı olduğunu tespit ettikten sonra, 401 status code ile (credential verilmediğinde dönenle aynı) bir `HTTPException` döndürün ve tarayıcının giriş penceresini yeniden göstermesi için `WWW-Authenticate` header'ını ekleyin:
{* ../../docs_src/security/tutorial007_an_py310.py hl[26:30] *}
diff --git a/docs/tr/docs/advanced/templates.md b/docs/tr/docs/advanced/templates.md
index f37eadf1dd..876280e434 100644
--- a/docs/tr/docs/advanced/templates.md
+++ b/docs/tr/docs/advanced/templates.md
@@ -1,3 +1,7 @@
+---
+render_macros: false
+---
+
# Şablonlar { #templates }
**FastAPI** ile istediğiniz herhangi bir template engine'i kullanabilirsiniz.
@@ -63,14 +67,10 @@ Ardından örneğin `templates/item.html` konumunda bir template yazabilirsiniz:
Şu HTML içeriğinde:
-{% raw %}
-
```jinja
Item ID: {{ id }}
```
-{% endraw %}
-
...gösterilecek olan `id`, sizin "context" olarak ilettiğiniz `dict` içinden alınır:
```Python
@@ -89,22 +89,48 @@ Template içinde `url_for()` da kullanabilirsiniz; argüman olarak, *path operat
Dolayısıyla şu bölüm:
-{% raw %}
-
```jinja
```
-{% endraw %}
-
...*path operation function* olan `read_item(id=id)` tarafından handle edilecek URL'nin aynısına bir link üretir.
-Örneğin ID değeri `42` ise, şu şekilde render edilir:
+`url_for()`, mevcut request'e göre şema ve host'u da içeren mutlak bir URL döndürür.
+
+Örneğin uygulamanız `https://example.com` adresinde sunuluyorsa ve ID değeri `42` ise, şu şekilde render edilir:
+
+```html
+
+```
+
+### Template'lerde URL Path'leri { #url-paths-in-templates }
+
+Aynı siteye verilen linklerde yalnızca URL path'ini almak için `.path` niteliğini kullanabilirsiniz. Örneğin, `templates/item_path.html` içinde:
+
+```jinja hl_lines="4 7"
+{!../../docs_src/templates/templates/item_path.html!}
+```
+
+Template'in adını `TemplateResponse`'a iletin:
+
+{* ../../docs_src/templates/tutorial002_py310.py ln[14:18] hl[17] *}
+
+Aynı örnekte, öğenin linki şu şekilde render edilir:
```html
```
+Baştaki `/`, bu path'i mevcut sitenin köküne göre göreli hale getirir.
+
+`.path` niteliği şemayı, host'u, query parametrelerini ve fragment'ı içermez. Başka bir host'a verilen linklerde tam URL'yi kullanın.
+
+/// tip | İpucu
+
+Uygulamanız bir proxy arkasındaysa, [Proxy Arkasında](behind-a-proxy.md) bölümünde açıklandığı gibi forwarded header'ları ve `root_path`'i yapılandırın.
+
+///
+
## Template'ler ve statik dosyalar { #templates-and-static-files }
Template içinde `url_for()` kullanabilir ve örneğin `name="static"` ile mount ettiğiniz `StaticFiles` ile birlikte kullanabilirsiniz.
diff --git a/docs/tr/docs/async.md b/docs/tr/docs/async.md
index b65756587a..9a28fe04fe 100644
--- a/docs/tr/docs/async.md
+++ b/docs/tr/docs/async.md
@@ -15,7 +15,7 @@ results = await some_library()
O zaman *path operasyon fonksiyonlarınızı* aşağıdaki gibi `async def` ile tanımlayın:
```Python hl_lines="2"
-@app.get('/')
+@app.get("/")
async def read_results():
results = await some_library()
return results
@@ -32,7 +32,7 @@ async def read_results():
Eğer bir veritabanı, bir API, dosya sistemi vb. ile iletişim kuran ve `await` desteği olmayan bir üçüncü taraf kütüphane kullanıyorsanız (bu şu anda çoğu veritabanı kütüphanesi için geçerlidir), o zaman *path operasyon fonksiyonlarınızı* normal olarak `def` ile tanımlayın:
```Python hl_lines="2"
-@app.get('/')
+@app.get("/")
def results():
results = some_library()
return results
@@ -48,7 +48,7 @@ Emin değilseniz, normal `def` kullanın.
---
-Not: *path operasyon fonksiyonlarınızda* `def` ve `async def`'i ihtiyacınız kadar karıştırabilirsiniz, her birini sizin için en iyi seçenekle tanımlayın. FastAPI onlar için doğru olanı yapacaktır.
+**Not**: *path operasyon fonksiyonlarınızda* `def` ve `async def`'i ihtiyacınız kadar karıştırabilirsiniz, her birini sizin için en iyi seçenekle tanımlayın. FastAPI onlar için doğru olanı yapacaktır.
Yukarıdaki durumların herhangi birinde FastAPI yine de asenkron olarak çalışır ve son derece hızlıdır.
@@ -56,7 +56,7 @@ Ancak yukarıdaki adımları izleyerek bazı performans optimizasyonları mümk
## Teknik Detaylar { #technical-details }
-Python’un modern sürümleri, **`async` ve `await`** sözdizimiyle, **"coroutines"** denilen bir yapıyı kullanarak **"asenkron kod"** desteğine sahiptir.
+Python'un modern sürümleri, **`async` ve `await`** sözdizimiyle, **"coroutines"** denilen bir yapıyı kullanarak **"asenkron kod"** desteğine sahiptir.
Aşağıdaki bölümlerde bu ifadeyi parça parça ele alalım:
@@ -155,7 +155,7 @@ Sıra sana geldiğinde gerçekten "üretken" işler yapıyorsun: menüyü işliy
Ama sonra, burgerlerin hâlâ gelmemiş olsa da, kasiyerle olan işin "duraklatılıyor" ⏸, çünkü burgerlerin hazır olmasını 🕙 beklemen gerekiyor.
-Fakat tezgâhtan uzaklaşıp masada sıra numaranla oturduğun için, dikkatinizi 🔀 aşkına çevirebilir, onunla "çalışmaya" ⏯ 🤓 odaklanabilirsin. Yani yine çok "üretken" bir şey yapıyorsun, aşkınla flört etmek gibi 😍.
+Fakat tezgâhtan uzaklaşıp masada sıra numaranla oturduğun için, dikkatini 🔀 aşkına çevirebilir, onunla "çalışmaya" ⏯ 🤓 odaklanabilirsin. Yani yine çok "üretken" bir şey yapıyorsun, aşkınla flört etmek gibi 😍.
Ardından kasiyer 💁, tezgâh ekranına numaranı koyarak "burgerleri bitirdim" diyor; ama numara seninki olduğunda çılgınca sıçramıyorsun. Sıra numaran sende, herkesin kendi numarası var; kimse burgerlerini çalamaz.
@@ -245,13 +245,13 @@ Ardından response'ların geri gelmesini yine 🕙 bekler.
Bu "beklemeler" 🕙 mikrosaniyelerle ölçülür; ama hepsi toplandığında sonuçta oldukça fazla bekleme olur.
-Bu yüzden web API’leri için asenkron ⏸🔀⏯ kod kullanmak çok mantıklıdır.
+Bu yüzden web API'leri için asenkron ⏸🔀⏯ kod kullanmak çok mantıklıdır.
-Bu tür asenkronluk, NodeJS’i popüler yapan şeydir (NodeJS paralel olmasa bile) ve Go dilinin gücüdür.
+Bu tür asenkronluk, NodeJS'i popüler yapan şeydir (NodeJS paralel olmasa bile) ve Go dilinin gücüdür.
Ve **FastAPI** ile elde ettiğiniz performans seviyesi de budur.
-Ayrıca, aynı anda hem paralellik hem de asenkronluk kullanabildiğiniz için, test edilen çoğu NodeJS framework’ünden daha yüksek ve C’ye daha yakın derlenen bir dil olan Go ile başa baş performans elde edersiniz [(hepsi Starlette sayesinde)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
+Ayrıca, aynı anda hem paralellik hem de asenkronluk kullanabildiğiniz için, test edilen çoğu NodeJS framework'ünden daha yüksek ve C'ye daha yakın derlenen bir dil olan Go ile başa baş performans elde edersiniz [(hepsi Starlette sayesinde)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
### Eşzamanlılık paralellikten daha mı iyi? { #is-concurrency-better-than-parallelism }
@@ -271,7 +271,7 @@ Hiçbir yerde 🕙 bekleme yok; sadece evin birden fazla yerinde yapılacak çok
Hamburger örneğindeki gibi dönüşlerle ilerleyebilirsin, önce salon, sonra mutfak; ama hiçbir şey 🕙 beklemediğin için, sadece temizlik yaptığından, dönüşlerin hiçbir etkisi olmaz.
-Dönüşlerle ya da dönüşsüz (eşzamanlılık) bitirmek aynı zaman alır ve aynı miktarda iş yapmış olursun.
+Dönüşlerle ya da dönüşsüz (eşzamanlılık) bitirmek aynı zamanı alır ve aynı miktarda iş yapmış olursun.
Ama bu durumda, 8 eski kasiyer/aşçı—yeni temizlikçiyi getirip her birine (artı sana) evin bir bölümünü versen, fazladan yardımla tüm işleri **paralel** yaparak çok daha çabuk bitirebilirdin.
@@ -281,28 +281,28 @@ Ve yürütme süresinin çoğu gerçek işten (bekleme yerine) oluştuğu ve bil
---
-CPU’ya bağlı işlemlerin yaygın örnekleri, karmaşık matematiksel işlem gerektiren iş yükleridir.
+CPU'ya bağlı işlemlerin yaygın örnekleri, karmaşık matematiksel işlem gerektiren iş yükleridir.
Örneğin:
* **Ses** veya **görüntü işleme**.
* **Bilgisayar görüsü**: bir görüntü milyonlarca pikselden oluşur, her pikselin 3 değeri / rengi vardır; işleme genellikle bu pikseller üzerinde aynı anda bir şeyler hesaplamayı gerektirir.
* **Makine Öğrenimi**: genellikle çok sayıda "matris" ve "vektör" çarpımı gerekir. Sayılar içeren devasa bir elektronik tabloyu ve hepsini aynı anda çarpmayı düşünün.
-* **Derin Öğrenme**: Makine Öğreniminin bir alt alanıdır, dolayısıyla aynısı geçerlidir. Sadece çarpılacak tek bir sayı tablosu değil, kocaman bir sayı kümesi vardır ve çoğu durumda bu modelleri kurmak ve/veya kullanmak için özel işlemciler kullanırsınız.
+* **Derin Öğrenme**: Makine Öğreniminin bir alt alanıdır, dolayısıyla aynısı geçerlidir. Sadece çarpılacak tek bir sayı tablosu değil, kocaman bir sayı tablosu kümesi vardır ve çoğu durumda bu modelleri kurmak ve/veya kullanmak için özel işlemciler kullanırsınız.
### Eşzamanlılık + Paralellik: Web + Makine Öğrenimi { #concurrency-parallelism-web-machine-learning }
-**FastAPI** ile web geliştirmede çok yaygın olan eşzamanlılıktan (NodeJS’in başlıca cazibesiyle aynı) yararlanabilirsiniz.
+**FastAPI** ile web geliştirmede çok yaygın olan eşzamanlılıktan (NodeJS'in başlıca cazibesiyle aynı) yararlanabilirsiniz.
-Ama ayrıca **CPU’ya bağlı** iş yükleri (Makine Öğrenimi sistemlerindeki gibi) için paralellik ve çoklu işlemden (paralel çalışan birden çok işlem) de yararlanabilirsiniz.
+Ama ayrıca **CPU'ya bağlı** iş yükleri (Makine Öğrenimi sistemlerindeki gibi) için paralellik ve çoklu işlemden (paralel çalışan birden çok işlem) de yararlanabilirsiniz.
-Buna ek olarak Python’un **Veri Bilimi**, Makine Öğrenimi ve özellikle Derin Öğrenme için ana dil olması, FastAPI’yi Veri Bilimi / Makine Öğrenimi web API’leri ve uygulamaları için çok iyi bir seçenek yapar.
+Buna ek olarak Python'un **Veri Bilimi**, Makine Öğrenimi ve özellikle Derin Öğrenme için ana dil olması, FastAPI'yi birçok başka alanın yanı sıra Veri Bilimi / Makine Öğrenimi web API'leri ve uygulamaları için çok iyi bir seçenek yapar.
-Production’da bu paralelliği nasıl sağlayacağınızı görmek için [Deployment](deployment/index.md) bölümüne bakın.
+Production'da bu paralelliği nasıl sağlayacağınızı görmek için [Deployment](deployment/index.md) bölümüne bakın.
## `async` ve `await` { #async-and-await }
-Python’un modern sürümleri, asenkron kodu tanımlamak için oldukça sezgisel bir yol sunar. Bu sayede kod normal "sıralı" kod gibi görünür ve doğru anlarda sizin yerinize "beklemeyi" yapar.
+Python'un modern sürümleri, asenkron kodu tanımlamak için oldukça sezgisel bir yol sunar. Bu sayede kod normal "sıralı" kod gibi görünür ve doğru anlarda sizin yerinize "beklemeyi" yapar.
Sonuçları vermeden önce bekleme gerektiren ve bu yeni Python özelliklerini destekleyen bir işlem olduğunda, şöyle kodlayabilirsiniz:
@@ -310,9 +310,9 @@ Sonuçları vermeden önce bekleme gerektiren ve bu yeni Python özelliklerini d
burgers = await get_burgers(2)
```
-Buradaki kilit nokta `await`. Python’a, sonuçları `burgers` değişkenine koymadan önce `get_burgers(2)` çalışmasının bitmesini 🕙 beklemesi ⏸ gerektiğini söyler. Böylece Python, bu arada başka bir şey 🔀 ⏯ yapabileceğini bilir (ör. başka bir request almak gibi).
+Buradaki kilit nokta `await`. Python'a, sonuçları `burgers` değişkenine koymadan önce `get_burgers(2)` çalışmasının bitmesini 🕙 beklemesi ⏸ gerektiğini söyler. Böylece Python, bu arada başka bir şey 🔀 ⏯ yapabileceğini bilir (ör. başka bir request almak gibi).
-`await`’in çalışabilmesi için, bu asenkronluğu destekleyen bir fonksiyonun içinde olması gerekir. Bunu yapmak için fonksiyonu `async def` ile tanımlayın:
+`await`'in çalışabilmesi için, bu asenkronluğu destekleyen bir fonksiyonun içinde olması gerekir. Bunu yapmak için fonksiyonu `async def` ile tanımlayın:
```Python hl_lines="1"
async def get_burgers(number: int):
@@ -343,7 +343,7 @@ burgers = get_burgers(2)
Dolayısıyla, `await` ile çağrılabileceğini söyleyen bir kütüphane kullanıyorsanız, onu kullanan *path operasyon fonksiyonunu* `async def` ile oluşturmanız gerekir, örneğin:
```Python hl_lines="2-3"
-@app.get('/burgers')
+@app.get("/burgers")
async def read_burgers():
burgers = await get_burgers(2)
return burgers
@@ -351,7 +351,7 @@ async def read_burgers():
### Daha teknik detaylar { #more-technical-details }
-`await`’in yalnızca `async def` ile tanımlanan fonksiyonların içinde kullanılabildiğini fark etmiş olabilirsiniz.
+`await`'in yalnızca `async def` ile tanımlanan fonksiyonların içinde kullanılabildiğini fark etmiş olabilirsiniz.
Aynı zamanda, `async def` ile tanımlanan fonksiyonların da "await" edilmesi gerekir. Yani `async def` ile tanımlanan fonksiyonlar yalnızca `async def` ile tanımlanan fonksiyonların içinde çağrılabilir.
@@ -369,7 +369,7 @@ Starlette (ve **FastAPI**) [AnyIO](https://anyio.readthedocs.io/en/stable/) üze
Hatta FastAPI kullanmıyor olsanız bile, yüksek uyumluluk ve avantajları (ör. *structured concurrency*) için [AnyIO](https://anyio.readthedocs.io/en/stable/) ile kendi async uygulamalarınızı yazabilirsiniz.
-AnyIO’nun üzerine, tür açıklamalarını biraz iyileştirmek ve daha iyi **otomatik tamamlama**, **satır içi hatalar** vb. elde etmek için ince bir katman olarak başka bir kütüphane daha oluşturdum. Ayrıca **kendi async kodunuzu** anlamanıza ve yazmanıza yardımcı olacak dostça bir giriş ve eğitim içerir: [Asyncer](https://asyncer.tiangolo.com/). Özellikle **async kodu normal** (bloklayan/senkron) **kodla birleştirmeniz** gerektiğinde faydalı olacaktır.
+AnyIO'nun üzerine, tür açıklamalarını biraz iyileştirmek ve daha iyi **otomatik tamamlama**, **satır içi hatalar** vb. elde etmek için ince bir katman olarak başka bir kütüphane daha oluşturdum. Ayrıca **kendi async kodunuzu** **anlamanıza** ve yazmanıza yardımcı olacak dostça bir giriş ve eğitim içerir: [Asyncer](https://asyncer.tiangolo.com/). Özellikle **async kodu normal** (bloklayan/senkron) **kodla birleştirmeniz** gerektiğinde faydalı olacaktır.
### Asenkron kodun diğer biçimleri { #other-forms-of-asynchronous-code }
@@ -381,25 +381,25 @@ Aynı (ya da neredeyse aynı) sözdizimi yakın zamanda modern JavaScript sürü
Bundan önce, asenkron kodu ele almak oldukça daha karmaşık ve zordu.
-Python’un önceki sürümlerinde thread’ler veya [Gevent](https://www.gevent.org/) kullanabilirdiniz. Ama kodu anlamak, hata ayıklamak ve üzerine düşünmek çok daha zordu.
+Python'un önceki sürümlerinde thread'ler veya [Gevent](https://www.gevent.org/) kullanabilirdiniz. Ama kodu anlamak, hata ayıklamak ve üzerine düşünmek çok daha zordu.
-NodeJS / Tarayıcı JavaScript’in önceki sürümlerinde "callback" kullanırdınız. Bu da "callback cehennemi"ne yol açardı.
+NodeJS / Tarayıcı JavaScript'in önceki sürümlerinde "callback" kullanırdınız. Bu da "callback cehennemi"ne yol açardı.
## Coroutine'ler { #coroutines }
**Coroutine**, bir `async def` fonksiyonunun döndürdüğü şeye verilen süslü isimdir. Python bunun bir fonksiyona benzer bir şey olduğunu, bir noktada başlayıp biteceğini bilir; ama içinde bir `await` olduğunda dahili olarak duraklatılabileceğini ⏸ de bilir.
-`async` ve `await` ile asenkron kod kullanmanın bu işlevselliği çoğu zaman "coroutine" kullanmak olarak özetlenir. Go’nun ana kilit özelliği olan "Goroutines" ile karşılaştırılabilir.
+`async` ve `await` ile asenkron kod kullanmanın bu işlevselliği çoğu zaman "coroutine" kullanmak olarak özetlenir. Go'nun ana kilit özelliği olan "Goroutines" ile karşılaştırılabilir.
## Sonuç { #conclusion }
Yukarıdaki cümleyi tekrar görelim:
-> Python’un modern sürümleri, **`async` ve `await`** sözdizimiyle, **"coroutines"** denilen bir yapıyı kullanarak **"asenkron kod"** desteğine sahiptir.
+> Python'un modern sürümleri, **`async` ve `await`** sözdizimiyle, **"coroutines"** denilen bir yapıyı kullanarak **"asenkron kod"** desteğine sahiptir.
Artık daha anlamlı gelmeli. ✨
-Bunların hepsi, FastAPI’ye (Starlette aracılığıyla) güç verir ve böylesine etkileyici bir performansa sahip olmasını sağlar.
+Bunların hepsi, FastAPI'ye (Starlette aracılığıyla) güç verir ve böylesine etkileyici bir performansa sahip olmasını sağlar.
## Çok Teknik Detaylar { #very-technical-details }
@@ -407,35 +407,35 @@ Bunların hepsi, FastAPI’ye (Starlette aracılığıyla) güç verir ve böyle
Büyük ihtimalle burayı atlayabilirsiniz.
-Bunlar, **FastAPI**’nin altında nasıl çalıştığına dair oldukça teknik ayrıntılardır.
+Bunlar, **FastAPI**'nin altında nasıl çalıştığına dair oldukça teknik ayrıntılardır.
-Coroutine’ler, thread’ler, blocking vb. hakkında teknik bilginiz varsa ve FastAPI’nin `async def` ile normal `def` arasındaki farkı nasıl ele aldığını merak ediyorsanız, devam edin.
+Coroutine'ler, thread'ler, blocking vb. hakkında teknik bilginiz varsa ve FastAPI'nin `async def` ile normal `def` arasındaki farkı nasıl ele aldığını merak ediyorsanız, devam edin.
///
### Path Operasyon Fonksiyonları { #path-operation-functions }
-Bir *path operasyon fonksiyonunu* `async def` yerine normal `def` ile tanımladığınızda, (sunucuyu bloklayacağından) doğrudan çağrılmak yerine, harici bir thread pool’da çalıştırılır ve ardından beklenir.
+Bir *path operasyon fonksiyonunu* `async def` yerine normal `def` ile tanımladığınızda, (sunucuyu bloklayacağından) doğrudan çağrılmak yerine, harici bir thread pool'da çalıştırılır ve ardından beklenir.
-Yukarıda açıklanan şekilde çalışmayan başka bir async framework’ten geliyorsanız ve ufak bir performans kazancı (yaklaşık 100 nanosaniye) için yalnızca hesaplama yapan basit *path operasyon fonksiyonlarını* düz `def` ile tanımlamaya alışkınsanız, **FastAPI**’de etkinin tam tersi olacağını unutmayın. Bu durumlarda, *path operasyon fonksiyonlarınız* bloklayan I/O yapan kod kullanmadıkça `async def` kullanmak daha iyidir.
+Yukarıda açıklanan şekilde çalışmayan başka bir async framework'ten geliyorsanız ve ufak bir performans kazancı (yaklaşık 100 nanosaniye) için yalnızca hesaplama yapan basit *path operasyon fonksiyonlarını* düz `def` ile tanımlamaya alışkınsanız, **FastAPI**'de etkinin tam tersi olacağını unutmayın. Bu durumlarda, *path operasyon fonksiyonlarınız* bloklayan I/O yapan kod kullanmadıkça `async def` kullanmak daha iyidir.
-Yine de her iki durumda da, **FastAPI**’nin önceki framework’ünüzden [hala daha hızlı](index.md#performance) (ya da en azından karşılaştırılabilir) olması muhtemeldir.
+Yine de her iki durumda da, **FastAPI**'nin önceki framework'ünüzden [hala daha hızlı](index.md#performance) (ya da en azından karşılaştırılabilir) olması muhtemeldir.
### Bağımlılıklar { #dependencies }
-Aynısı [bağımlılıklar](tutorial/dependencies/index.md) için de geçerlidir. Bir bağımlılık `async def` yerine standart bir `def` fonksiyonuysa, harici thread pool’da çalıştırılır.
+Aynısı [bağımlılıklar](tutorial/dependencies/index.md) için de geçerlidir. Bir bağımlılık `async def` yerine standart bir `def` fonksiyonuysa, harici thread pool'da çalıştırılır.
### Alt-bağımlılıklar { #sub-dependencies }
-Birbirini gerektiren birden çok bağımlılık ve [alt-bağımlılık](tutorial/dependencies/sub-dependencies.md) olabilir (fonksiyon tanımlarının parametreleri olarak). Bazıları `async def` ile, bazıları normal `def` ile oluşturulmuş olabilir. Yine de çalışır ve normal `def` ile oluşturulanlar "await" edilmek yerine harici bir thread’de (thread pool’dan) çağrılır.
+Birbirini gerektiren birden çok bağımlılık ve [alt-bağımlılık](tutorial/dependencies/sub-dependencies.md) olabilir (fonksiyon tanımlarının parametreleri olarak). Bazıları `async def` ile, bazıları normal `def` ile oluşturulmuş olabilir. Yine de çalışır ve normal `def` ile oluşturulanlar "await" edilmek yerine harici bir thread'de (thread pool'dan) çağrılır.
### Diğer yardımcı fonksiyonlar { #other-utility-functions }
Doğrudan çağırdığınız diğer yardımcı fonksiyonları normal `def` veya `async def` ile tanımlayabilirsiniz ve FastAPI onları çağırma biçiminizi etkilemez.
-Bu, FastAPI’nin sizin için çağırdığı fonksiyonların tersidir: *path operasyon fonksiyonları* ve bağımlılıklar.
+Bu, FastAPI'nin sizin için çağırdığı fonksiyonların tersidir: *path operasyon fonksiyonları* ve bağımlılıklar.
-Yardımcı fonksiyonunuz `def` ile tanımlı normal bir fonksiyonsa, bir thread pool’da değil doğrudan (kodunuzda yazdığınız gibi) çağrılır; fonksiyon `async def` ile tanımlıysa kodunuzda çağırırken onu `await` etmelisiniz.
+Yardımcı fonksiyonunuz `def` ile tanımlı normal bir fonksiyonsa, bir thread pool'da değil doğrudan (kodunuzda yazdığınız gibi) çağrılır; fonksiyon `async def` ile tanımlıysa kodunuzda çağırırken onu `await` etmelisiniz.
---
diff --git a/docs/tr/docs/features.md b/docs/tr/docs/features.md
index fd95c0425a..a635fef2c7 100644
--- a/docs/tr/docs/features.md
+++ b/docs/tr/docs/features.md
@@ -6,18 +6,18 @@
### Açık Standartlara Dayalı { #based-on-open-standards }
-* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) ile API oluşturma; buna path operasyonları, parametreler, request body'leri, güvenlik vb. deklarasyonları dahildir.
+* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) ile API oluşturma; buna path operasyonları, parametreler, request body'leri, güvenlik vb. deklarasyonları dahildir.
* [**JSON Schema**](https://json-schema.org/) ile otomatik veri modeli dokümantasyonu (OpenAPI zaten JSON Schema'ya dayanır).
* Bu standartlar etrafında, titiz bir çalışmanın ardından tasarlandı; sonradan eklenmiş bir katman değil.
* Bu sayede birçok dilde otomatik **client code generation** da kullanılabilir.
### Otomatik Dokümantasyon { #automatic-docs }
-Etkileşimli API dokümantasyonu ve keşif için web arayüzleri. Framework OpenAPI’ye dayandığından, birden fazla seçenek vardır; varsayılan olarak 2’si dahildir.
+Etkileşimli API dokümantasyonu ve keşif için web arayüzleri. Framework OpenAPI'ye dayandığından, birden fazla seçenek vardır; varsayılan olarak 2'si dahildir.
-* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) ile etkileşimli keşif; API’nizi tarayıcıdan doğrudan çağırıp test edin.
+* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) ile etkileşimli keşif; API'nizi tarayıcıdan doğrudan çağırıp test edin.
-
+
* [**ReDoc**](https://github.com/Redocly/redoc) ile alternatif API dokümantasyonu.
@@ -27,7 +27,7 @@ Etkileşimli API dokümantasyonu ve keşif için web arayüzleri. Framework Open
Her şey standart **Python type** deklarasyonlarına dayanır (Pydantic sayesinde). Öğrenilecek yeni bir söz dizimi yok. Sadece standart, modern Python.
-Python type’larını nasıl kullanacağınıza dair 2 dakikalık bir hatırlatmaya ihtiyacınız varsa (FastAPI kullanmasanız bile) kısa eğitime göz atın: [Python Types](python-types.md).
+Python type'larını nasıl kullanacağınıza dair 2 dakikalık bir hatırlatmaya ihtiyacınız varsa (FastAPI kullanmasanız bile) kısa eğitime göz atın: [Python Tipleri](python-types.md).
Türleriyle standart Python yazarsınız:
@@ -36,6 +36,7 @@ from datetime import date
from pydantic import BaseModel
+
# Bir değişkeni str olarak belirt
# ve fonksiyon içinde editör desteği al
def main(user_id: str):
@@ -67,7 +68,7 @@ my_second_user: User = User(**second_user_data)
`**second_user_data` şu anlama gelir:
-`second_user_data` dict’indeki anahtar ve değerleri doğrudan anahtar-değer argümanları olarak geç; şu ifadeye eşdeğerdir: `User(id=4, name="Mary", joined="2018-11-30")`
+`second_user_data` dict'indeki anahtar ve değerleri doğrudan anahtar-değer argümanları olarak geç; şu ifadeye eşdeğerdir: `User(id=4, name="Mary", joined="2018-11-30")`
///
@@ -85,19 +86,19 @@ Editörünüz şöyle yardımcı olabilir:
* [Visual Studio Code](https://code.visualstudio.com/) ile:
-
+
* [PyCharm](https://www.jetbrains.com/pycharm/) ile:
-
+
-Daha önce imkânsız olduğunu düşünebileceğiniz yerlerde bile tamamlama alırsınız. Örneğin, bir request’ten gelen (iç içe de olabilir) JSON body içindeki `price` anahtarı için.
+Daha önce imkânsız olduğunu düşünebileceğiniz yerlerde bile tamamlama alırsınız. Örneğin, bir request'ten gelen (iç içe de olabilir) JSON body içindeki `price` anahtarı için.
Artık anahtar adlarını yanlış yazmak, dokümana gidip gelmek ya da sonunda `username` mi `user_name` mi kullandığınızı bulmak için sayfayı yukarı aşağı kaydırmak yok.
### Kısa { #short }
-Her şey için mantıklı **varsayılanlar** ve her yerde isteğe bağlı yapılandırmalar vardır. Tüm parametreler, ihtiyacınızı karşılayacak şekilde ince ayar yapılarak tanımlamak istediğiniz API’yi oluşturabilir.
+Her şey için mantıklı **varsayılanlar** ve her yerde isteğe bağlı yapılandırmalar vardır. Tüm parametreler, ihtiyacınızı karşılayacak şekilde ince ayar yapılarak tanımlamak istediğiniz API'yi oluşturabilir.
Ancak varsayılan hâliyle hepsi **"hemen çalışır"**.
@@ -109,7 +110,7 @@ Ancak varsayılan hâliyle hepsi **"hemen çalışır"**.
* Minimum ve maksimum uzunlukları tanımlanan String (`str`) alanları.
* Min ve max değerleri olan sayılar (`int`, `float`) vb.
-* Daha “egzotik” tipler için doğrulama:
+* Daha "egzotik" tipler için doğrulama:
* URL.
* Email.
* UUID.
@@ -121,29 +122,29 @@ Tüm doğrulama köklü ve sağlam **Pydantic** tarafından yapılır.
Güvenlik ve kimlik doğrulama entegredir. Veritabanları veya veri modelleriyle ilgili hiçbir taviz yoktur.
-OpenAPI’da tanımlanan tüm güvenlik şemaları, şunlar dâhil:
+OpenAPI'de tanımlanan tüm güvenlik şemaları, şunlar dâhil:
* HTTP Basic.
-* **OAuth2** (ayrıca **JWT token**’larla). Şu eğitime göz atın: [OAuth2 with JWT](tutorial/security/oauth2-jwt.md).
+* **OAuth2** (ayrıca **JWT token**'larla). Şu eğitime göz atın: [JWT ile OAuth2](tutorial/security/oauth2-jwt.md).
* API anahtarları:
- * Header’larda.
+ * Header'larda.
* Query parametrelerinde.
- * Cookie’lerde vb.
+ * Cookie'lerde vb.
-Buna ek olarak Starlette’in tüm güvenlik özellikleri (**session cookies** dâhil).
+Buna ek olarak Starlette'in tüm güvenlik özellikleri (**session cookies** dâhil).
Tümü, sistemleriniz, veri depolarınız, ilişkisel ve NoSQL veritabanlarınız vb. ile kolayca entegre edilebilen, yeniden kullanılabilir araçlar ve bileşenler olarak inşa edilmiştir.
### Dependency Injection { #dependency-injection }
-FastAPI, son derece kolay kullanımlı ama son derece güçlü bir Dependency Injection sistemine sahiptir.
+FastAPI, son derece kolay kullanımlı ama son derece güçlü bir Dependency Injection sistemine sahiptir.
* Bağımlılıkların da kendi bağımlılıkları olabilir; böylece bir hiyerarşi veya **bağımlılıklar "grafı"** oluşur.
* Tüm süreç framework tarafından **otomatik olarak yönetilir**.
-* Tüm bağımlılıklar, request’lerden veri talep edebilir ve *path operation* kısıtlarını ve otomatik dokümantasyonu **zenginleştirebilir**.
+* Tüm bağımlılıklar, request'lerden veri talep edebilir ve **path operation kısıtlarını ve otomatik dokümantasyonu zenginleştirebilir**.
* Bağımlılıklarda tanımlanan *path operation* parametreleri için bile **otomatik doğrulama**.
* Karmaşık kullanıcı kimlik doğrulama sistemleri, **veritabanı bağlantıları** vb. için destek.
-* Veritabanları, frontend’ler vb. ile **taviz yok**; ancak hepsiyle kolay entegrasyon.
+* Veritabanları, frontend'ler vb. ile **taviz yok**; ancak hepsiyle kolay entegrasyon.
### Sınırsız "Plug-in" { #unlimited-plug-ins }
@@ -154,48 +155,48 @@ Her entegrasyon (bağımlılıklar ile) o kadar basit olacak şekilde tasarlanm
### Test Edildi { #tested }
* %100 test kapsayıcılığı.
-* %100 type annotated kod tabanı.
+* %100 tip anotasyonlu kod tabanı.
* Üretimde kullanılan uygulamalarda kullanılıyor.
## Starlette Özellikleri { #starlette-features }
**FastAPI**, [**Starlette**](https://starlette.dev/) ile tamamen uyumludur (ve onun üzerine kuruludur). Dolayısıyla elinizdeki ek Starlette kodları da çalışır.
-`FastAPI` aslında `Starlette`’in bir alt sınıfıdır. Starlette’i zaten biliyor veya kullanıyorsanız, işlevlerin çoğu aynı şekilde çalışır.
+`FastAPI` aslında `Starlette`'in bir alt sınıfıdır. Starlette'i zaten biliyor veya kullanıyorsanız, işlevlerin çoğu aynı şekilde çalışır.
-**FastAPI** ile **Starlette**’in tüm özelliklerini elde edersiniz (FastAPI, steroid basılmış Starlette gibidir):
+**FastAPI** ile **Starlette**'in tüm özelliklerini elde edersiniz (FastAPI, steroid basılmış Starlette gibidir):
-* Cidden etkileyici performans. [Mevcut en hızlı Python frameworklerinden biridir; **NodeJS** ve **Go** ile aynı seviyededir](https://github.com/encode/starlette#performance).
+* Cidden etkileyici performans. [Mevcut en hızlı Python framework'lerinden biridir; **NodeJS** ve **Go** ile aynı seviyededir](https://github.com/encode/starlette#performance).
* **WebSocket** desteği.
* Süreç içi arka plan görevleri.
* Başlatma ve kapatma olayları.
* HTTPX üzerine kurulu test istemcisi.
-* **CORS**, GZip, Static Files, Streaming response’lar.
+* **CORS**, GZip, Static Files, Streaming response'lar.
* **Session ve Cookie** desteği.
* %100 test kapsayıcılığı.
-* %100 type annotated kod tabanı.
+* %100 tip anotasyonlu kod tabanı.
## Pydantic Özellikleri { #pydantic-features }
**FastAPI**, [**Pydantic**](https://pydantic.dev/docs/) ile tamamen uyumludur (ve onun üzerine kuruludur). Dolayısıyla elinizdeki ek Pydantic kodları da çalışır.
-Pydantic’e dayanan harici kütüphaneler de dâhildir; veritabanları için ORM’ler, ODM’ler gibi.
+Pydantic'e dayanan harici kütüphaneler de dâhildir; veritabanları için ORM'ler, ODM'ler gibi.
-Bu aynı zamanda, birçok durumda request’ten aldığınız nesneyi **doğrudan veritabanına** iletebileceğiniz anlamına gelir; zira her şey otomatik olarak doğrulanır.
+Bu aynı zamanda, birçok durumda request'ten aldığınız nesneyi **doğrudan veritabanına** iletebileceğiniz anlamına gelir; zira her şey otomatik olarak doğrulanır.
-Tersi yönde de geçerlidir; birçok durumda veritabanından aldığınız nesneyi **doğrudan client**’a gönderebilirsiniz.
+Tersi yönde de geçerlidir; birçok durumda veritabanından aldığınız nesneyi **doğrudan client**'a gönderebilirsiniz.
-**FastAPI** ile **Pydantic**’in tüm özelliklerini elde edersiniz (FastAPI, tüm veri işlemede Pydantic’e dayanır):
+**FastAPI** ile **Pydantic**'in tüm özelliklerini elde edersiniz (FastAPI, tüm veri işlemede Pydantic'e dayanır):
* **Kafa karıştırmaz**:
* Öğrenmeniz gereken yeni bir şema tanımlama mikro-dili yok.
- * Python type’larını biliyorsanız Pydantic’i nasıl kullanacağınızı da biliyorsunuz.
-* **IDE/linter/beyin**’inizle iyi anlaşır:
+ * Python type'larını biliyorsanız Pydantic'i nasıl kullanacağınızı da biliyorsunuz.
+* **IDE/linter/beyninizle** iyi anlaşır:
* Pydantic veri yapıları, sizin tanımladığınız sınıfların örnekleridir; bu nedenle doğrulanmış verilerinizle otomatik tamamlama, linting ve mypy sorunsuz çalışır, sezgileriniz de yol gösterir.
* **Karmaşık yapıları** doğrulayın:
- * Hiyerarşik Pydantic modelleri, Python `typing`’in `List` ve `Dict`’i vb. kullanımı.
+ * Hiyerarşik Pydantic modelleri, Python `typing`'in `List` ve `Dict`'i vb. kullanımı.
* Doğrulayıcılar (validators), karmaşık veri şemalarının net ve kolay şekilde tanımlanmasını, kontrol edilmesini ve JSON Schema olarak dokümante edilmesini sağlar.
* Derinlemesine iç içe **JSON** nesnelerine sahip olabilir, hepsinin doğrulanmasını ve anotasyonlanmasını sağlayabilirsiniz.
* **Genişletilebilir**:
- * Pydantic, özel veri tiplerinin tanımlanmasına izin verir; ayrıca validator decorator’üyle bir modeldeki metodlarla doğrulamayı genişletebilirsiniz.
+ * Pydantic, özel veri tiplerinin tanımlanmasına izin verir; ayrıca validator decorator'üyle bir modeldeki metodlarla doğrulamayı genişletebilirsiniz.
* %100 test kapsayıcılığı.
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md
index cfd32051e2..a6503baf68 100644
--- a/docs/tr/docs/index.md
+++ b/docs/tr/docs/index.md
@@ -131,9 +131,9 @@ Temel özellikleri şunlardır:
---
-"_**FastAPI** kütüphanesini, **predictions** almak için sorgulanabilecek bir **REST** server oluşturmak amacıyla benimsedik. [Ludwig için]_"
+"_**FastAPI** kütüphanesini, **tahminler** almak için sorgulanabilecek bir **REST** server oluşturmak amacıyla benimsedik. [Ludwig için]_"
-fastapi dev komutu hakkında...lt için de
Ayrıca sayısal doğrulamalar da tanımlayabilirsiniz:
-* `gt`: `g`reater `t`han
-* `ge`: `g`reater than or `e`qual
-* `lt`: `l`ess `t`han
-* `le`: `l`ess than or `e`qual
+* `gt`: `g`reater `t`han (büyüktür)
+* `ge`: `g`reater than or `e`qual (büyük veya eşittir)
+* `lt`: `l`ess `t`han (küçüktür)
+* `le`: `l`ess than or `e`qual (küçük veya eşittir)
/// note | Not
diff --git a/docs/tr/docs/tutorial/query-param-models.md b/docs/tr/docs/tutorial/query-param-models.md
index 75139a6777..47a15d3690 100644
--- a/docs/tr/docs/tutorial/query-param-models.md
+++ b/docs/tr/docs/tutorial/query-param-models.md
@@ -2,7 +2,7 @@
Birbirleriyle ilişkili bir **query parameter** grubunuz varsa, bunları tanımlamak için bir **Pydantic model** oluşturabilirsiniz.
-Böylece **modeli yeniden kullanabilir**, **birden fazla yerde** tekrar tekrar kullanabilir ve tüm parametreler için validation (doğrulama) ile metadata’yı tek seferde tanımlayabilirsiniz. 😎
+Böylece **modeli yeniden kullanabilir**, **birden fazla yerde** tekrar tekrar kullanabilir ve tüm parametreler için validation (doğrulama) ile metadata'yı tek seferde tanımlayabilirsiniz. 😎
/// note | Not
@@ -12,15 +12,15 @@ Bu özellik FastAPI `0.115.0` sürümünden beri desteklenmektedir. 🤓
## Pydantic Model ile Query Parameters { #query-parameters-with-a-pydantic-model }
-İhtiyacınız olan **query parameter**’ları bir **Pydantic model** içinde tanımlayın, ardından parametreyi `Query` olarak belirtin:
+İhtiyacınız olan **query parameter**'ları bir **Pydantic model** içinde tanımlayın, ardından parametreyi `Query` olarak belirtin:
{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
-**FastAPI**, request’teki **query parameter**’lardan **her field** için veriyi **extract** eder ve tanımladığınız Pydantic model’i size verir.
+**FastAPI**, request'teki **query parameter**'lardan **her field** için veriyi **extract** eder ve tanımladığınız Pydantic model'i size verir.
## Dokümanları Kontrol Edin { #check-the-docs }
-Query parameter’ları `/docs` altındaki dokümantasyon arayüzünde görebilirsiniz:
+Query parameter'ları `/docs` altındaki dokümantasyon arayüzünde görebilirsiniz:
@@ -28,21 +28,21 @@ Query parameter’ları `/docs` altındaki dokümantasyon arayüzünde görebili
## Ek Query Parameter'ları Yasaklayın { #forbid-extra-query-parameters }
-Bazı özel kullanım senaryolarında (muhtemelen çok yaygın değil), almak istediğiniz query parameter’ları **kısıtlamak** isteyebilirsiniz.
+Bazı özel kullanım senaryolarında (muhtemelen çok yaygın değil), almak istediğiniz query parameter'ları **kısıtlamak** isteyebilirsiniz.
-Pydantic’in model konfigürasyonunu kullanarak `extra` field’ları `forbid` edebilirsiniz:
+Pydantic'in model konfigürasyonunu kullanarak `extra` field'ları `forbid` edebilirsiniz:
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
-Bir client, **query parameter**’larda **ek (extra)** veri göndermeye çalışırsa, **error** response alır.
+Bir client, **query parameter**'larda **ek (extra)** veri göndermeye çalışırsa, **error** response alır.
-Örneğin client, değeri `plumbus` olan bir `tool` query parameter’ı göndermeye çalışırsa:
+Örneğin client, değeri `plumbus` olan bir `tool` query parameter'ı göndermeye çalışırsa:
```http
https://example.com/items/?limit=10&tool=plumbus
```
-`tool` query parameter’ına izin verilmediğini söyleyen bir **error** response alır:
+`tool` query parameter'ına izin verilmediğini söyleyen bir **error** response alır:
```json
{
@@ -57,12 +57,48 @@ https://example.com/items/?limit=10&tool=plumbus
}
```
+## Parametre Modellerini Birleştirin { #combine-parameter-models }
+
+Birden fazla query parameter modeli tanımlayabilir ve bunları tekil query parameter'larla veya dependency'lerle birleştirebilirsiniz.
+
+{* ../../docs_src/query_param_models/tutorial003_an_py310.py hl[9:15,20:22] *}
+
+Request parametreleri aynı seviyede kalır.
+
+```http
+https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt
+```
+
+Query string'de `pagination` veya `filters` anahtarları bulunmaz. Her model, kendi varsayılan değerleri, field validator'ları ve model validator'larıyla query parameter'ları bağımsız olarak doğrular. Modeller veya tekil parametreler dependency'lerde tanımlandığında da aynı durum geçerlidir.
+
+Modeller aynı parametre adını veya alias'ı paylaşıyorsa, her model bu request parametresini bağımsız olarak doğrular. Bağımsız değerler için farklı adlar veya alias'lar kullanın. OpenAPI, dependency'lerle paylaşılan parametrelerde olduğu gibi, paylaşılan bir parametreyi yalnızca bir kez listeler. Bu nedenle, paylaşılan parametre tanımları aynı türü ve kısıtlamaları belirtmelidir.
+
+Her modelin `extra` konfigürasyonu, diğer modellerde veya dependency'lerde tanımlananlar da dahil olmak üzere tüm query parameter'lara uygulanır. `extra="forbid"` kullanıldığında, modelin dışında kalan tüm parametreler reddedilir. `extra="allow"` kullanıldığında ise bu parametreler modele ek veriler olarak dahil edilir.
+
+Bu, `Header` ve `Cookie` modelleri için de geçerlidir.
+
+## İsteğe Bağlı Query Parameter Modelleri { #optional-query-parameter-models }
+
+Grubu isteğe bağlı hale getirmek için query parameter modelini `| None` ile tanımlayın ve varsayılan değerini `None` olarak ayarlayın.
+
+{* ../../docs_src/query_param_models/tutorial004_an_py310.py hl[18] *}
+
+Ne `start` ne de `end` gönderilirse, `date_range` değeri `None` olur. İkisinden biri gönderilirse, FastAPI modeli doğrular ve her iki field'ı da zorunlu kılar.
+
+Varsayılan değer belirtmeden `| None` kullanıldığında parametre yine zorunludur.
+
+Ek parametreler modelin `extra` konfigürasyonuna göre işlenir. Yok sayılan ek parametreler, modelin gönderilmiş sayılmasına neden olmaz.
+
+OpenAPI, gruptaki field'ları ayrı ayrı listeler ve isteğe bağlı olarak işaretler.
+
+İsteğe bağlı [header parameter modelleri](header-param-models.md#optional-header-parameter-models) ve [cookie parameter modelleri](cookie-param-models.md#optional-cookie-parameter-models) de tanımlayabilirsiniz.
+
## Özet { #summary }
-**FastAPI** içinde **query parameter**’ları tanımlamak için **Pydantic model**’leri kullanabilirsiniz. 😎
+**FastAPI** içinde **query parameter**'ları tanımlamak için **Pydantic model**'leri kullanabilirsiniz. 😎
/// tip | İpucu
-Spoiler: cookie ve header’ları tanımlamak için de Pydantic model’leri kullanabilirsiniz; ancak bunu tutorial’ın ilerleyen bölümlerinde göreceksiniz. 🤫
+Spoiler: cookie ve header'ları tanımlamak için de Pydantic model'leri kullanabilirsiniz; ancak bunu tutorial'ın ilerleyen bölümlerinde göreceksiniz. 🤫
///
diff --git a/docs/tr/docs/tutorial/query-params-str-validations.md b/docs/tr/docs/tutorial/query-params-str-validations.md
index 86c102e762..90df529c8a 100644
--- a/docs/tr/docs/tutorial/query-params-str-validations.md
+++ b/docs/tr/docs/tutorial/query-params-str-validations.md
@@ -7,11 +7,11 @@
{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
-Query parametresi `q`, `str | None` tipindedir. Yani tipi `str`’dir ama `None` da olabilir. Nitekim varsayılan değer `None` olduğu için FastAPI bunun zorunlu olmadığını anlar.
+Query parametresi `q`, `str | None` tipindedir. Yani tipi `str`'dir ama `None` da olabilir. Nitekim varsayılan değer `None` olduğu için FastAPI bunun zorunlu olmadığını anlar.
/// note | Not
-FastAPI, `q`’nun zorunlu olmadığını `= None` varsayılan değerinden anlar.
+FastAPI, `q`'nun zorunlu olmadığını `= None` varsayılan değerinden anlar.
`str | None` kullanmak, editörünüzün daha iyi destek vermesini ve hataları yakalamasını sağlar.
@@ -36,7 +36,7 @@ FastAPI, 0.95.0 sürümünde `Annotated` desteğini ekledi (ve önermeye başlad
Daha eski bir sürüm kullanıyorsanız `Annotated` kullanmaya çalışırken hata alırsınız.
-`Annotated` kullanmadan önce FastAPI sürümünü en az 0.95.1’e yükseltmek için [FastAPI sürümünü yükseltin](../deployment/versions.md#upgrading-the-fastapi-versions).
+`Annotated` kullanmadan önce FastAPI sürümünü en az 0.95.1'e yükseltmek için [FastAPI sürümünü yükseltin](../deployment/versions.md#upgrading-the-fastapi-versions).
///
@@ -58,19 +58,19 @@ q: str | None = None
q: Annotated[str | None] = None
```
-Bu iki sürüm de aynı anlama gelir: `q`, `str` veya `None` olabilen bir parametredir ve varsayılan olarak `None`’dır.
+Bu iki sürüm de aynı anlama gelir: `q`, `str` veya `None` olabilen bir parametredir ve varsayılan olarak `None`'dır.
Şimdi işin eğlenceli kısmına geçelim. 🎉
## `q` parametresindeki `Annotated` içine `Query` ekleyin { #add-query-to-annotated-in-the-q-parameter }
-Artık ek bilgi (bu durumda ek doğrulama) koyabildiğimiz bir `Annotated`’ımız olduğuna göre, `Annotated` içine `Query` ekleyin ve `max_length` parametresini `50` olarak ayarlayın:
+Artık ek bilgi (bu durumda ek doğrulama) koyabildiğimiz bir `Annotated`'ımız olduğuna göre, `Annotated` içine `Query` ekleyin ve `max_length` parametresini `50` olarak ayarlayın:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *}
Varsayılan değerin hâlâ `None` olduğuna dikkat edin; yani parametre hâlâ opsiyonel.
-Ama şimdi `Annotated` içinde `Query(max_length=50)` kullanarak FastAPI’ye bu değer için **ek doğrulama** istediğimizi söylüyoruz: en fazla 50 karakter. 😎
+Ama şimdi `Annotated` içinde `Query(max_length=50)` kullanarak FastAPI'ye bu değer için **ek doğrulama** istediğimizi söylüyoruz: en fazla 50 karakter. 😎
/// tip | İpucu
@@ -86,7 +86,7 @@ FastAPI artık şunları yapacak:
## Alternatif (eski): Varsayılan değer olarak `Query` { #alternative-old-query-as-the-default-value }
-FastAPI’nin önceki sürümlerinde ( 0.95.0 öncesi) `Query`’yi `Annotated` içine koymak yerine, parametrenizin varsayılan değeri olarak kullanmanız gerekiyordu. Etrafta bu şekilde yazılmış kod görme ihtimaliniz yüksek; bu yüzden açıklayalım.
+FastAPI'nin önceki sürümlerinde ( 0.95.0 öncesi) `Query`'yi `Annotated` içine koymak yerine, parametrenizin varsayılan değeri olarak kullanmanız gerekiyordu. Etrafta bu şekilde yazılmış kod görme ihtimaliniz yüksek; bu yüzden açıklayalım.
/// tip | İpucu
@@ -115,7 +115,7 @@ q: str | None = None
Ancak `Query` sürümü bunun bir query parametresi olduğunu açıkça belirtir.
-Sonrasında `Query`’ye daha fazla parametre geçebiliriz. Bu örnekte string’ler için geçerli olan `max_length`:
+Sonrasında `Query`'ye daha fazla parametre geçebiliriz. Bu örnekte string'ler için geçerli olan `max_length`:
```Python
q: str | None = Query(default=None, max_length=50)
@@ -149,15 +149,15 @@ q: Annotated[str, Query()] = "rick"
q: str = Query(default="rick")
```
-### `Annotated`’ın avantajları { #advantages-of-annotated }
+### `Annotated`'ın avantajları { #advantages-of-annotated }
Fonksiyon parametrelerindeki varsayılan değer stiline göre **`Annotated` kullanmanız önerilir**; birden fazla nedenle **daha iyidir**. 🤓
**Fonksiyon parametresinin** **varsayılan** değeri, **gerçek varsayılan** değerdir; bu genel olarak Python açısından daha sezgiseldir. 😌
-Aynı fonksiyonu FastAPI olmadan **başka yerlerde** de **çağırabilirsiniz** ve **beklendiği gibi çalışır**. Eğer **zorunlu** bir parametre varsa (varsayılan değer yoksa) editörünüz hata ile bunu belirtir; ayrıca gerekli parametreyi vermeden çalıştırırsanız **Python** da şikayet eder.
+Aynı fonksiyonu FastAPI olmadan **başka yerlerde** de **çağırabilirsiniz** ve **beklendiği gibi çalışır**. Eğer **zorunlu** bir parametre varsa (varsayılan değer yoksa) **editörünüz** hata ile bunu belirtir; ayrıca gerekli parametreyi vermeden çalıştırırsanız **Python** da şikayet eder.
-`Annotated` kullanmayıp bunun yerine **(eski) varsayılan değer stilini** kullanırsanız, o fonksiyonu FastAPI olmadan **başka yerlerde** çağırdığınızda doğru çalışması için argümanları geçmeniz gerektiğini **hatırlamak** zorunda kalırsınız; yoksa değerler beklediğinizden farklı olur (ör. `QueryInfo` veya benzeri). Üstelik editörünüz de şikayet etmez ve Python da fonksiyonu çalıştırırken şikayet etmez; ancak içerideki operasyonlar hata verince ortaya çıkar.
+`Annotated` kullanmayıp bunun yerine **(eski) varsayılan değer stilini** kullanırsanız, o fonksiyonu FastAPI olmadan **başka yerlerde** çağırdığınızda doğru çalışması için argümanları geçmeniz gerektiğini **hatırlamak** zorunda kalırsınız; yoksa değerler beklediğinizden farklı olur (ör. `str` yerine `QueryInfo` veya benzeri). Üstelik editörünüz de şikayet etmez ve Python da fonksiyonu çalıştırırken şikayet etmez; ancak içerideki operasyonlar hata verince ortaya çıkar.
`Annotated` birden fazla metadata anotasyonu alabildiği için, artık aynı fonksiyonu [Typer](https://typer.tiangolo.com/) gibi başka araçlarla da kullanabilirsiniz. 🚀
@@ -169,17 +169,17 @@ Aynı fonksiyonu FastAPI olmadan **başka yerlerde** de **çağırabilirsiniz**
## Regular expression ekleyin { #add-regular-expressions }
-Parametrenin eşleşmesi gereken bir `pattern` düzenli ifade tanımlayabilirsiniz:
+Parametrenin eşleşmesi gereken bir `pattern` düzenli ifade tanımlayabilirsiniz:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
-Bu özel regular expression pattern’i, gelen parametre değerinin şunları sağladığını kontrol eder:
+Bu özel regular expression pattern'i, gelen parametre değerinin şunları sağladığını kontrol eder:
* `^`: Aşağıdaki karakterlerle başlar; öncesinde karakter yoktur.
* `fixedquery`: Tam olarak `fixedquery` değerine sahiptir.
* `$`: Orada biter; `fixedquery` sonrasında başka karakter yoktur.
-Bu **"regular expression"** konuları gözünüzü korkutuyorsa sorun değil. Birçok kişi için zor bir konudur. Regular expression’lara ihtiyaç duymadan da pek çok şey yapabilirsiniz.
+Bu **"regular expression"** konuları gözünüzü korkutuyorsa sorun değil. Birçok kişi için zor bir konudur. Regular expression'lara ihtiyaç duymadan da pek çok şey yapabilirsiniz.
Artık ihtiyaç duyduğunuzda **FastAPI** içinde kullanabileceğinizi biliyorsunuz.
@@ -221,19 +221,27 @@ Dolayısıyla `Query` kullanırken bir değeri zorunlu yapmak istediğinizde, va
{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
-### Zorunlu ama `None` olabilir { #required-can-be-none }
+### Zorunlu parametreler ve `None` { #required-parameters-and-none }
-Bir parametrenin `None` kabul edebileceğini söyleyip yine de zorunlu olmasını sağlayabilirsiniz. Bu, client’ların değer göndermesini zorunlu kılar; değer `None` olsa bile.
-
-Bunu yapmak için `None`’ı geçerli bir tip olarak tanımlayın ama varsayılan değer vermeyin:
+`str | None` tipi, Python değeri olarak `None` kullanılmasına izin verir ancak query parametresini opsiyonel yapmaz. Varsayılan bir değer yoksa parametre hâlâ zorunludur:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+Query parametrelerinin değerleri string olarak gelir ve `None` için yerleşik bir gösterimleri yoktur. `?q=None` veya `?q=null` göndermek, sırasıyla `"None"` ve `"null"` string'lerini gönderir. `?q=` göndermek ise boş bir string gönderir; bu da bu örnekteki `min_length=3` doğrulamasından geçemez.
+
+Client'ların `q` parametresini göndermemesine ve bu durumda değerinin `None` olmasına izin vermek için varsayılan değerini `None` yapın:
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+JSON request body'leri, query parametrelerinin aksine açıkça belirtilmiş bir `null` değeri içerebilir.
+
## Query parametresi listesi / birden fazla değer { #query-parameter-list-multiple-values }
Bir query parametresini `Query` ile açıkça tanımladığınızda, bir değer listesi alacak şekilde (başka bir deyişle, birden fazla değer alacak şekilde) de tanımlayabilirsiniz.
-Örneğin URL’de `q` query parametresinin birden fazla kez görünebilmesini istiyorsanız şöyle yazabilirsiniz:
+Örneğin URL'de `q` query parametresinin birden fazla kez görünebilmesini istiyorsanız şöyle yazabilirsiniz:
{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
@@ -243,9 +251,9 @@ Sonra şu URL ile:
http://localhost:8000/items/?q=foo&q=bar
```
-*path operation function* içinde, *function parameter* olan `q` parametresinde, birden fazla `q` *query parameters* değerini (`foo` ve `bar`) bir Python `list`’i olarak alırsınız.
+*path operation function* içinde, *function parameter* olan `q` parametresinde, birden fazla `q` *query parametresinin* değerini (`foo` ve `bar`) bir Python `list`'i olarak alırsınız.
-Dolayısıyla bu URL’ye response şöyle olur:
+Dolayısıyla bu URL'ye response şöyle olur:
```JSON
{
@@ -258,7 +266,7 @@ Dolayısıyla bu URL’ye response şöyle olur:
/// tip | İpucu
-Yukarıdaki örnekte olduğu gibi tipi `list` olan bir query parametresi tanımlamak için `Query`’yi açıkça kullanmanız gerekir; aksi halde request body olarak yorumlanır.
+Yukarıdaki örnekte olduğu gibi tipi `list` olan bir query parametresi tanımlamak için `Query`'yi açıkça kullanmanız gerekir; aksi halde request body olarak yorumlanır.
///
@@ -278,7 +286,7 @@ Hiç değer verilmezse varsayılan bir `list` de tanımlayabilirsiniz:
http://localhost:8000/items/
```
-`q`’nun varsayılanı `["foo", "bar"]` olur ve response şöyle olur:
+`q`'nun varsayılanı `["foo", "bar"]` olur ve response şöyle olur:
```JSON
{
@@ -307,7 +315,7 @@ Bu durumda FastAPI, listenin içeriğini kontrol etmez.
Parametre hakkında daha fazla bilgi ekleyebilirsiniz.
-Bu bilgiler oluşturulan OpenAPI’a dahil edilir ve dokümantasyon arayüzleri ile harici araçlar tarafından kullanılır.
+Bu bilgiler oluşturulan OpenAPI'ye dahil edilir ve dokümantasyon arayüzleri ile harici araçlar tarafından kullanılır.
/// note | Not
@@ -349,9 +357,9 @@ O zaman bir `alias` tanımlayabilirsiniz; bu alias, parametre değerini bulmak i
Diyelim ki artık bu parametreyi istemiyorsunuz.
-Bazı client’lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça kullanımdan kalkmış olarak göstermesini istiyorsunuz.
+Bazı client'lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça kullanımdan kalkmış olarak göstermesini istiyorsunuz.
-O zaman `Query`’ye `deprecated=True` parametresini geçin:
+O zaman `Query`'ye `deprecated=True` parametresini geçin:
{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *}
@@ -359,9 +367,9 @@ Dokümanlarda şöyle görünür:
-## Parametreleri OpenAPI’dan hariç tutun { #exclude-parameters-from-openapi }
+## Parametreleri OpenAPI'den hariç tutun { #exclude-parameters-from-openapi }
-Oluşturulan OpenAPI şemasından (dolayısıyla otomatik dokümantasyon sistemlerinden) bir query parametresini hariç tutmak için `Query`’nin `include_in_schema` parametresini `False` yapın:
+Oluşturulan OpenAPI şemasından (dolayısıyla otomatik dokümantasyon sistemlerinden) bir query parametresini hariç tutmak için `Query`'nin `include_in_schema` parametresini `False` yapın:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
@@ -371,15 +379,15 @@ Yukarıdaki parametrelerle yapılamayan bazı **özel doğrulama** ihtiyaçları
Bu durumlarda, normal doğrulamadan sonra (ör. değerin `str` olduğunun doğrulanmasından sonra) uygulanacak bir **custom validator function** kullanabilirsiniz.
-Bunu, `Annotated` içinde [Pydantic’in `AfterValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-after-validator)’ını kullanarak yapabilirsiniz.
+Bunu, `Annotated` içinde [Pydantic'in `AfterValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-after-validator)'ını kullanarak yapabilirsiniz.
/// tip | İpucu
-Pydantic’te [`BeforeValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-before-validator) ve başka validator’lar da vardır. 🤓
+Pydantic'te [`BeforeValidator`](https://pydantic.dev/docs/validation/latest/concepts/validators/#field-before-validator) ve başka validator'lar da vardır. 🤓
///
-Örneğin bu custom validator, bir item ID’sinin ISBN kitap numarası için `isbn-` ile veya IMDB film URL ID’si için `imdb-` ile başladığını kontrol eder:
+Örneğin bu custom validator, bir item ID'sinin ISBN kitap numarası için `isbn-` ile veya IMDB film URL ID'si için `imdb-` ile başladığını kontrol eder:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
@@ -393,7 +401,7 @@ Bu özellik Pydantic 2 ve üzeri sürümlerde mevcuttur. 😎
Veritabanı veya başka bir API gibi herhangi bir **harici bileşen** ile iletişim gerektiren bir doğrulama yapmanız gerekiyorsa, bunun yerine **FastAPI Dependencies** kullanmalısınız; onları ileride öğreneceksiniz.
-Bu custom validator’lar, request’te sağlanan **yalnızca** **aynı veri** ile kontrol edilebilen şeyler içindir.
+Bu custom validator'lar, request'te sağlanan **yalnızca** **aynı veri** ile kontrol edilebilen şeyler içindir.
///
@@ -413,17 +421,17 @@ Fark ettiniz mi? `value.startswith()` ile bir string, tuple alabilir ve tuple i
#### Rastgele Bir Item { #a-random-item }
-`data.items()` ile, her dictionary öğesi için key ve value içeren tuple’lardan oluşan bir yinelemeli nesne elde ederiz.
+`data.items()` ile, her dictionary öğesi için key ve value içeren tuple'lardan oluşan bir yinelenebilir nesne elde ederiz.
-Bu yinelemeli nesneyi `list(data.items())` ile düzgün bir `list`’e çeviririz.
+Bu yinelenebilir nesneyi `list(data.items())` ile düzgün bir `list`'e çeviririz.
-Ardından `random.choice()` ile list’ten **rastgele bir değer** alırız; yani `(id, name)` içeren bir tuple elde ederiz. Şuna benzer: `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+Ardından `random.choice()` ile list'ten **rastgele bir değer** alırız; yani `(id, name)` içeren bir tuple elde ederiz. Şuna benzer: `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
Sonra tuple içindeki bu **iki değeri** `id` ve `name` değişkenlerine **atarız**.
-Böylece kullanıcı bir item ID’si vermemiş olsa bile yine de rastgele bir öneri alır.
+Böylece kullanıcı bir item ID'si vermemiş olsa bile yine de rastgele bir öneri alır.
-...bütün bunları **tek bir basit satırda** yapıyoruz. 🤯 Python’u sevmemek elde mi? 🐍
+...bütün bunları **tek bir basit satırda** yapıyoruz. 🤯 Python'u sevmemek elde mi? 🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
@@ -438,7 +446,7 @@ Genel doğrulamalar ve metadata:
* `description`
* `deprecated`
-String’lere özel doğrulamalar:
+String'lere özel doğrulamalar:
* `min_length`
* `max_length`
diff --git a/docs/tr/docs/tutorial/query-params.md b/docs/tr/docs/tutorial/query-params.md
index 4f12c4fadf..bd758f1334 100644
--- a/docs/tr/docs/tutorial/query-params.md
+++ b/docs/tr/docs/tutorial/query-params.md
@@ -107,7 +107,13 @@ veya
http://127.0.0.1:8000/items/foo?short=yes
```
-veya başka herhangi bir büyük/küçük harf varyasyonunda (tamamı büyük, ilk harf büyük, vb.), fonksiyonunuz `short` parametresini `bool` değeri `True` olarak görecektir. Aksi halde `False` olarak görür.
+veya başka herhangi bir büyük/küçük harf varyasyonunda (tamamı büyük, ilk harf büyük, vb.), fonksiyonunuz `short` parametresini `bool` değeri `True` olarak görecektir.
+
+`0`, `false`, `off` ve `no` gibi değerler (büyük/küçük harf varyasyonları dahil) `False` değerine dönüştürülür.
+
+`short` belirtilmezse, **FastAPI** bu örnekte `False` olan varsayılan değerini kullanır.
+
+Boş bir değer (`?short=`) veya tanınmayan bir değer (örneğin, `?short=maybe`) `422` doğrulama hatasına neden olur.
## Çoklu path ve query parametreleri { #multiple-path-and-query-parameters }
diff --git a/docs/tr/docs/tutorial/request-form-models.md b/docs/tr/docs/tutorial/request-form-models.md
index 28afab7977..0b22662b09 100644
--- a/docs/tr/docs/tutorial/request-form-models.md
+++ b/docs/tr/docs/tutorial/request-form-models.md
@@ -28,6 +28,8 @@ Sadece, **form field** olarak almak istediğiniz alanlarla bir **Pydantic model*
**FastAPI**, request içindeki **form data**'dan **her bir field** için veriyi **çıkarır** ve size tanımladığınız Pydantic model'ini verir.
+[HTML onay kutuları](request-forms.md#boolean-form-fields) için varsayılan değeri `False` olan boolean field'lar tanımlayın.
+
## Dokümanları Kontrol Edin { #check-the-docs }
Bunu `/docs` altındaki doküman arayüzünde doğrulayabilirsiniz:
@@ -73,6 +75,58 @@ Bir client fazladan veri göndermeye çalışırsa, bir **error** response alır
}
```
+## Form Model'lerini Birleştirin { #combine-form-models }
+
+Birden fazla form model'ini ayrı `Form` parametreleriyle birleştirebilirsiniz.
+
+{* ../../docs_src/request_form_models/tutorial003_an_py310.py hl[9:14,19:21] *}
+
+Client, `name`, `tags` ve `token` değerlerini form field'ları olarak gönderir. Her model, form field'larını bağımsız olarak doğrular.
+
+Her model'in `extra` konfigürasyonu, diğer parametrelerde veya bağımlılıklarda tanımlanan field'lar ve dosyalar dahil tüm form field'larına uygulanır. `extra="forbid"` kullanıldığında, o model'in dışındaki tüm field'lar reddedilir. `extra="allow"` kullanıldığında ise bu field'lar model'e ek veri olarak dahil edilir.
+
+Birden fazla tanım aynı form field adını kullanıyorsa, her biri o field'ın değerini doğrular. OpenAPI şemasının ortak field'ları tutarlı bir şekilde tanımlayabilmesi için bu field'larda uyumlu türler ve kısıtlamalar kullanın.
+
+## İsteğe Bağlı Form Model'leri { #optional-form-models }
+
+Grubu isteğe bağlı hale getirmek için form model'ini `| None` ile tanımlayın ve varsayılan değerini `None` olarak belirleyin.
+
+{* ../../docs_src/request_form_models/tutorial005_an_py310.py hl[17] *}
+
+Ne `name` ne de `age` gönderilirse, `profile` değeri `None` olur. İkisinden biri gönderilirse, FastAPI model'i doğrular ve her iki field'ı da zorunlu tutar. Boş bir değer gönderilmesi de field'ın sağlandığı anlamına gelir.
+
+Varsayılan değer belirtmeden `| None` kullanırsanız parametre yine zorunlu olur.
+
+Fazladan field'lar, model'in `extra` konfigürasyonuna göre işlenir. Yok sayılan fazladan field'lar, model'in sağlanmış sayılmasına neden olmaz.
+
+Yalnızca işaretlenmemiş onay kutuları içeren isteğe bağlı bir model, gönderilmemiş kabul edilir. Model'i açıkça sağlamak için `enabled=false` gibi bir değer gönderin.
+
+## Form Model'lerinin İsteğe Bağlı Union'ları { #optional-unions-of-form-models }
+
+Model'lerden oluşan isteğe bağlı bir union da kullanabilirsiniz.
+
+{* ../../docs_src/request_form_models/tutorial006_an_py310.py hl[9:16,21] *}
+
+Hiçbir form field'ı gönderilmezse, `contact` değeri `None` olur. `name` ile birlikte `kind=person` veya `company_name` ile birlikte `kind=company` gönderin. Discriminator (ayırt edici), hangi model'in doğrulanacağını seçer.
+
+## Form Model'lerinin Union'larını Birleştirin { #combine-unions-of-form-models }
+
+Union'ları diğer form model'leriyle, ayrı `Form` parametreleriyle ve `File` parametreleriyle birleştirebilirsiniz. Her union bağımsız olarak doğrulanır.
+
+{* ../../docs_src/request_form_models/tutorial007_an_py310.py hl[31:35] *}
+
+Tüm field'ları aynı form içinde gönderin. Örneğin, `contact_type=person`, `name=Rick`, `notification_type=email`, `email=rick@example.com` ve `token=secret` gönderin.
+
+`notification` değerini `None` olarak bırakmak için bildirim field'larını göndermeyin.
+
+## Form Model'leri ve Dosyalar { #form-models-and-files }
+
+Bir form model'ini [dosya parametreleriyle](request-files.md) de birleştirebilirsiniz.
+
+{* ../../docs_src/request_form_models/tutorial004_an_py310.py hl[14] *}
+
+Burada client, `name` field'ını ve `avatar` dosyasını `multipart/form-data` kullanarak gönderir.
+
## Özet { #summary }
FastAPI'de form field'larını tanımlamak için Pydantic model'lerini kullanabilirsiniz. 😎
diff --git a/docs/tr/docs/tutorial/request-forms.md b/docs/tr/docs/tutorial/request-forms.md
index 836b17ed83..23084befd0 100644
--- a/docs/tr/docs/tutorial/request-forms.md
+++ b/docs/tr/docs/tutorial/request-forms.md
@@ -1,6 +1,6 @@
# Form Verisi { #form-data }
-When you need to receive form fields instead of JSON, you can use `Form`.
+JSON yerine form alanlarını almanız gerektiğinde `Form` kullanabilirsiniz.
/// note | Not
@@ -40,10 +40,18 @@ Form parametrelerini `Body` veya `Query` için yaptığınız gibi oluşturun:
/// tip | İpucu
-Form gövdelerini tanımlamak için `Form`'u açıkça kullanmanız gerekir; çünkü bunu yapmazsanız parametreler query parametreleri veya body (JSON) parametreleri olarak yorumlanır.
+Form body'lerini tanımlamak için `Form`'u açıkça kullanmanız gerekir; çünkü bunu yapmazsanız parametreler query parametreleri veya body (JSON) parametreleri olarak yorumlanır.
///
+## Boolean Form Alanları { #boolean-form-fields }
+
+Tarayıcılar, HTML formlarını gönderirken işaretlenmemiş onay kutularını göndermez. Onay kutusu işaretlenmediğinde `False` almak için varsayılan değeri `False` olan bir boolean form parametresi tanımlayın:
+
+{* ../../docs_src/request_forms/tutorial002_an_py310.py hl[9] *}
+
+İşaretli bir onay kutusu, varsayılan olarak `"on"` olan değerini gönderir. **FastAPI**, `"on"` değerini `True` olarak kabul eder.
+
## "Form Alanları" Hakkında { #about-form-fields }
HTML formlarının (``) verileri sunucuya gönderme şekli normalde bu veri için JSON'dan farklı "özel" bir encoding kullanır.
@@ -56,6 +64,8 @@ Formlardan gelen veri normalde "media type" `application/x-www-form-urlencoded`
Ancak form dosyalar içerdiğinde `multipart/form-data` olarak encode edilir. Dosyaları ele almayı bir sonraki bölümde okuyacaksınız.
+OpenAPI'da bir multipart formunu tanımlamak için `Form(media_type="multipart/form-data")` kullanabilirsiniz. Form parametrelerini veya modellerini birleştirirken bunu tek bir parametrede ayarlamanız yeterlidir.
+
Bu encoding'ler ve form alanları hakkında daha fazla okumak isterseniz, [MDN `POST` için web dokümanları](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) sayfasına gidin.
///
diff --git a/docs/tr/docs/tutorial/response-model.md b/docs/tr/docs/tutorial/response-model.md
index 676631538a..d763a2e83a 100644
--- a/docs/tr/docs/tutorial/response-model.md
+++ b/docs/tr/docs/tutorial/response-model.md
@@ -266,6 +266,7 @@ Bunlar, `exclude_defaults` ve `exclude_none` için [Pydantic dokümanlarında](h
Ama data’nız modelde default değeri olan field’lar için değer içeriyorsa, örneğin ID’si `bar` olan item gibi:
+
```Python hl_lines="3 5"
{
"name": "Bar",
@@ -274,6 +275,7 @@ Ama data’nız modelde default değeri olan field’lar için değer içeriyors
"tax": 20.2
}
```
+
bunlar response’a dahil edilir.
@@ -281,6 +283,7 @@ bunlar response’a dahil edilir.
Eğer data, default değerlerle aynı değerlere sahipse, örneğin ID’si `baz` olan item gibi:
+
```Python hl_lines="3 5-6"
{
"name": "Baz",
@@ -290,6 +293,7 @@ Eğer data, default değerlerle aynı değerlere sahipse, örneğin ID’si `baz
"tags": []
}
```
+
FastAPI yeterince akıllıdır (aslında Pydantic yeterince akıllıdır) ve `description`, `tax`, `tags` default ile aynı olsa bile bunların explicit olarak set edildiğini (default’tan alınmadığını) anlar.
diff --git a/docs/tr/docs/tutorial/security/simple-oauth2.md b/docs/tr/docs/tutorial/security/simple-oauth2.md
index fdc318019e..346a7c3b6f 100644
--- a/docs/tr/docs/tutorial/security/simple-oauth2.md
+++ b/docs/tr/docs/tutorial/security/simple-oauth2.md
@@ -2,29 +2,29 @@
Şimdi önceki bölümün üzerine inşa edip, eksik parçaları ekleyerek tam bir güvenlik akışı oluşturalım.
-## `username` ve `password`’ü Alma { #get-the-username-and-password }
+## `username` ve `password`'ü Alma { #get-the-username-and-password }
-`username` ve `password`’ü almak için **FastAPI** security yardımcı araçlarını kullanacağız.
+`username` ve `password`'ü almak için **FastAPI** security yardımcı araçlarını kullanacağız.
OAuth2, (bizim kullandığımız) "password flow" kullanılırken client/kullanıcının form verisi olarak `username` ve `password` alanlarını göndermesi gerektiğini belirtir.
Ayrıca spesifikasyon, bu alanların adlarının tam olarak böyle olması gerektiğini söyler. Yani `user-name` veya `email` işe yaramaz.
-Ancak merak etmeyin, frontend’de son kullanıcılarınıza dilediğiniz gibi gösterebilirsiniz.
+Ancak merak etmeyin, frontend'de son kullanıcılarınıza dilediğiniz gibi gösterebilirsiniz.
Veritabanı model(ler)inizde de istediğiniz başka isimleri kullanabilirsiniz.
-Fakat login *path operation*’ı için, spesifikasyonla uyumlu olmak (ve örneğin entegre API dokümantasyon sistemini kullanabilmek) adına bu isimleri kullanmamız gerekiyor.
+Fakat login *path operation*'ı için, spesifikasyonla uyumlu olmak (ve örneğin entegre API dokümantasyon sistemini kullanabilmek) adına bu isimleri kullanmamız gerekiyor.
-Spesifikasyon ayrıca `username` ve `password`’ün form verisi olarak gönderilmesi gerektiğini de söyler (yani burada JSON yok).
+Spesifikasyon ayrıca `username` ve `password`'ün form verisi olarak gönderilmesi gerektiğini de söyler (yani burada JSON yok).
### `scope` { #scope }
-Spesifikasyon, client’ın "`scope`" adlı başka bir form alanı da gönderebileceğini söyler.
+Spesifikasyon, client'ın "`scope`" adlı başka bir form alanı da gönderebileceğini söyler.
-Form alanının adı `scope`’tur (tekil), ama aslında boşluklarla ayrılmış "scope"’lardan oluşan uzun bir string’dir.
+Form alanının adı `scope`'tur (tekil), ama aslında boşluklarla ayrılmış "scope"'lardan oluşan uzun bir string'dir.
-Her bir "scope" sadece bir string’dir (boşluk içermez).
+Her bir "scope" sadece bir string'dir (boşluk içermez).
Genelde belirli güvenlik izinlerini (permission) belirtmek için kullanılırlar, örneğin:
@@ -34,31 +34,31 @@ Genelde belirli güvenlik izinlerini (permission) belirtmek için kullanılırla
/// note | Not
-OAuth2’de bir "scope", gerekli olan belirli bir izni ifade eden basit bir string’dir.
+OAuth2'de bir "scope", gerekli olan belirli bir izni ifade eden basit bir string'dir.
`:` gibi başka karakterler içermesi veya URL olması önemli değildir.
-Bu detaylar implementasyon’a özeldir.
+Bu detaylar implementasyona özeldir.
-OAuth2 açısından bunlar sadece string’lerdir.
+OAuth2 açısından bunlar sadece string'lerdir.
///
-## `username` ve `password`’ü Almak İçin Kod { #code-to-get-the-username-and-password }
+## `username` ve `password`'ü Almak İçin Kod { #code-to-get-the-username-and-password }
-Şimdi bunu yönetmek için **FastAPI**’nin sağladığı araçları kullanalım.
+Şimdi bunu yönetmek için **FastAPI**'nin sağladığı araçları kullanalım.
### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
-Önce `OAuth2PasswordRequestForm`’u import edin ve `/token` için *path operation* içinde `Depends` ile dependency olarak kullanın:
+Önce `OAuth2PasswordRequestForm`'u import edin ve `/token` için *path operation* içinde `Depends` ile dependency olarak kullanın:
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
-`OAuth2PasswordRequestForm`, şu alanları içeren bir form body tanımlayan bir class dependency’sidir:
+`OAuth2PasswordRequestForm`, şu alanları içeren bir form body tanımlayan bir class dependency'sidir:
* `username`.
* `password`.
-* Boşlukla ayrılmış string’lerden oluşan büyük bir string olarak opsiyonel `scope` alanı.
+* Boşlukla ayrılmış string'lerden oluşan büyük bir string olarak opsiyonel `scope` alanı.
* Opsiyonel `grant_type`.
/// tip | İpucu
@@ -74,11 +74,11 @@ Bunu zorlamak istiyorsanız, `OAuth2PasswordRequestForm` yerine `OAuth2PasswordR
/// note | Not
-`OAuth2PasswordRequestForm`, `OAuth2PasswordBearer` gibi **FastAPI**’ye özel “özel bir sınıf” değildir.
+`OAuth2PasswordRequestForm`, `OAuth2PasswordBearer` gibi **FastAPI**'ye özel bir sınıf değildir.
-`OAuth2PasswordBearer`, bunun bir security scheme olduğunu **FastAPI**’ye bildirir. Bu yüzden OpenAPI’ye o şekilde eklenir.
+`OAuth2PasswordBearer`, bunun bir security scheme olduğunu **FastAPI**'ye bildirir. Bu yüzden OpenAPI'ye o şekilde eklenir.
-Ama `OAuth2PasswordRequestForm` sadece bir class dependency’dir; bunu kendiniz de yazabilirdiniz ya da doğrudan `Form` parametreleri tanımlayabilirdiniz.
+Ama `OAuth2PasswordRequestForm` sadece bir class dependency'dir; bunu kendiniz de yazabilirdiniz ya da doğrudan `Form` parametreleri tanımlayabilirdiniz.
Fakat çok yaygın bir kullanım olduğu için **FastAPI** bunu işleri kolaylaştırmak adına doğrudan sağlar.
@@ -88,43 +88,43 @@ Fakat çok yaygın bir kullanım olduğu için **FastAPI** bunu işleri kolayla
/// tip | İpucu
-`OAuth2PasswordRequestForm` dependency class’ının instance’ında boşluklarla ayrılmış uzun string olarak bir `scope` attribute’u olmaz; bunun yerine gönderilen her scope için gerçek string listesini içeren `scopes` attribute’u olur.
+`OAuth2PasswordRequestForm` dependency class'ının instance'ında boşluklarla ayrılmış uzun string olarak bir `scope` attribute'u olmaz; bunun yerine gönderilen her scope için gerçek string listesini içeren `scopes` attribute'u olur.
Bu örnekte `scopes` kullanmıyoruz, ama ihtiyacınız olursa bu özellik hazır.
///
-Şimdi form alanındaki `username`’i kullanarak (sahte) veritabanından kullanıcı verisini alın.
+Şimdi form alanındaki `username`'i kullanarak (sahte) veritabanından kullanıcı verisini alın.
Böyle bir kullanıcı yoksa, "Incorrect username or password" diyerek bir hata döndürelim.
-Hata için `HTTPException` exception’ını kullanıyoruz:
+Hata için `HTTPException` exception'ını kullanıyoruz:
{* ../../docs_src/security/tutorial003_an_py310.py hl[3,79:81] *}
-### Password’ü Kontrol Etme { #check-the-password }
+### Password'ü Kontrol Etme { #check-the-password }
-Bu noktada veritabanından kullanıcı verisine sahibiz, ancak password’ü henüz kontrol etmedik.
+Bu noktada veritabanından kullanıcı verisine sahibiz, ancak password'ü henüz kontrol etmedik.
Önce bu veriyi Pydantic `UserInDB` modeline koyalım.
Asla düz metin (plaintext) password kaydetmemelisiniz; bu yüzden (sahte) password hashing sistemini kullanacağız.
-Password’ler eşleşmezse, aynı hatayı döndürürüz.
+Password'ler eşleşmezse, aynı hatayı döndürürüz.
#### Password hashing { #password-hashing }
-"Hashing" şudur: bir içeriği (bu örnekte password) anlaşılmaz görünen bayt dizisine (yani bir string’e) dönüştürmek.
+"Hashing" şudur: bir içeriği (bu örnekte password) anlaşılmaz görünen bayt dizisine (yani bir string'e) dönüştürmek.
-Aynı içeriği (aynı password’ü) her verdiğinizde, birebir aynı anlamsız görünen çıktıyı elde edersiniz.
+Aynı içeriği (aynı password'ü) her verdiğinizde, birebir aynı anlamsız görünen çıktıyı elde edersiniz.
-Ama bu anlamsız çıktıyı tekrar password’e geri çeviremezsiniz.
+Ama bu anlamsız çıktıyı tekrar password'e geri çeviremezsiniz.
##### Neden password hashing kullanılır { #why-use-password-hashing }
-Veritabanınız çalınırsa, hırsız kullanıcılarınızın düz metin password’lerine değil, sadece hash’lere sahip olur.
+Veritabanınız çalınırsa, hırsız kullanıcılarınızın düz metin password'lerine değil, sadece hash'lere sahip olur.
-Dolayısıyla hırsız, aynı password’leri başka bir sistemde denemeye çalışamaz (birçok kullanıcı her yerde aynı password’ü kullandığı için bu tehlikeli olurdu).
+Dolayısıyla hırsız, aynı password'leri başka bir sistemde denemeye çalışamaz (birçok kullanıcı her yerde aynı password'ü kullandığı için bu tehlikeli olurdu).
{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *}
@@ -132,37 +132,37 @@ Dolayısıyla hırsız, aynı password’leri başka bir sistemde denemeye çal
`UserInDB(**user_dict)` şu anlama gelir:
-*`user_dict` içindeki key ve value’ları doğrudan key-value argümanları olarak geçir; şu ifadeyle eşdeğerdir:*
+*`user_dict` içindeki key ve value'ları doğrudan key-value argümanları olarak geçir; şu ifadeyle eşdeğerdir:*
```Python
UserInDB(
- username = user_dict["username"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- disabled = user_dict["disabled"],
- hashed_password = user_dict["hashed_password"],
+ username=user_dict["username"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ disabled=user_dict["disabled"],
+ hashed_password=user_dict["hashed_password"],
)
```
/// note | Not
-`**user_dict` için daha kapsamlı bir açıklama için [**Extra Models** dokümantasyonundaki ilgili bölüme](../extra-models.md#about-user-in-model-dump) geri dönüp bakın.
+`**user_dict` için daha kapsamlı bir açıklama için [**Ek Modeller** dokümantasyonundaki ilgili bölüme](../extra-models.md#about-user-in-model-dump) geri dönüp bakın.
///
-## Token’ı Döndürme { #return-the-token }
+## Token'ı Döndürme { #return-the-token }
-`token` endpoint’inin response’u bir JSON object olmalıdır.
+`token` endpoint'inin response'u bir JSON object olmalıdır.
-Bir `token_type` içermelidir. Biz "Bearer" token’ları kullandığımız için token type "`bearer`" olmalıdır.
+Bir `token_type` içermelidir. Biz "Bearer" token'ları kullandığımız için token type "`bearer`" olmalıdır.
-Ayrıca `access_token` içermelidir; bunun değeri access token’ımızı içeren bir string olmalıdır.
+Ayrıca `access_token` içermelidir; bunun değeri access token'ımızı içeren bir string olmalıdır.
-Bu basit örnekte tamamen güvensiz davranıp token olarak aynı `username`’i döndüreceğiz.
+Bu basit örnekte tamamen güvensiz davranıp token olarak aynı `username`'i döndüreceğiz.
/// tip | İpucu
-Bir sonraki bölümde, password hashing ve JWT token’ları ile gerçekten güvenli bir implementasyon göreceksiniz.
+Bir sonraki bölümde, password hashing ve JWT token'ları ile gerçekten güvenli bir implementasyon göreceksiniz.
Ama şimdilik ihtiyacımız olan spesifik detaylara odaklanalım.
@@ -174,7 +174,7 @@ Ama şimdilik ihtiyacımız olan spesifik detaylara odaklanalım.
Spesifikasyona göre, bu örnekteki gibi `access_token` ve `token_type` içeren bir JSON döndürmelisiniz.
-Bunu kendi kodunuzda kendiniz yapmalı ve bu JSON key’lerini kullandığınızdan emin olmalısınız.
+Bunu kendi kodunuzda kendiniz yapmalı ve bu JSON key'lerini kullandığınızdan emin olmalısınız.
Spesifikasyonlara uyum için, doğru yapmanız gereken neredeyse tek şey budur.
@@ -182,33 +182,33 @@ Geri kalanını **FastAPI** sizin yerinize yönetir.
///
-## Dependency’leri Güncelleme { #update-the-dependencies }
+## Dependency'leri Güncelleme { #update-the-dependencies }
-Şimdi dependency’lerimizi güncelleyeceğiz.
+Şimdi dependency'lerimizi güncelleyeceğiz.
-`current_user`’ı *sadece* kullanıcı aktifse almak istiyoruz.
+`current_user`'ı *sadece* kullanıcı aktifse almak istiyoruz.
-Bu yüzden, `get_current_user`’ı dependency olarak kullanan ek bir dependency olan `get_current_active_user`’ı oluşturuyoruz.
+Bu yüzden, `get_current_user`'ı dependency olarak kullanan ek bir dependency olan `get_current_active_user`'ı oluşturuyoruz.
Bu iki dependency de kullanıcı yoksa veya pasifse sadece HTTP hatası döndürecek.
-Dolayısıyla endpoint’imizde kullanıcıyı ancak kullanıcı varsa, doğru şekilde authenticate edildiyse ve aktifse alacağız:
+Dolayısıyla endpoint'imizde kullanıcıyı ancak kullanıcı varsa, doğru şekilde authenticate edildiyse ve aktifse alacağız:
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
/// note | Not
-Burada `Bearer` değerine sahip ek `WWW-Authenticate` header’ını döndürmemiz de spesifikasyonun bir parçasıdır.
+Burada `Bearer` değerine sahip ek `WWW-Authenticate` header'ını döndürmemiz de spesifikasyonun bir parçasıdır.
-Herhangi bir HTTP (hata) durum kodu 401 "UNAUTHORIZED", ayrıca `WWW-Authenticate` header’ı da döndürmelidir.
+Herhangi bir HTTP (hata) durum kodu 401 "UNAUTHORIZED", ayrıca `WWW-Authenticate` header'ı da döndürmelidir.
-Bearer token’lar (bizim durumumuz) için bu header’ın değeri `Bearer` olmalıdır.
+Bearer token'lar (bizim durumumuz) için bu header'ın değeri `Bearer` olmalıdır.
-Aslında bu ekstra header’ı atlayabilirsiniz, yine de çalışır.
+Aslında bu ekstra header'ı atlayabilirsiniz, yine de çalışır.
Ama spesifikasyonlara uyumlu olması için burada eklenmiştir.
-Ayrıca, bunu bekleyen ve kullanan araçlar olabilir (şimdi veya ileride) ve bu da sizin ya da kullanıcılarınız için faydalı olabilir.
+Ayrıca, bunu bekleyen ve kullanan araçlar olabilir (şimdi veya ileride) ve bu da sizin ya da kullanıcılarınız için şimdi veya ileride faydalı olabilir.
Standartların faydası da bu...
@@ -224,7 +224,7 @@ Etkileşimli dokümanları açın: [http://127.0.0.1:8000/docs](http://127.0.0.1
Şu bilgileri kullanın:
-User: `johndoe`
+Kullanıcı: `johndoe`
Password: `secret`
@@ -236,7 +236,7 @@ Sistemde authenticate olduktan sonra şöyle görürsünüz:
### Kendi Kullanıcı Verinizi Alma { #get-your-own-user-data }
-Şimdi `/users/me` path’inde `GET` operasyonunu kullanın.
+Şimdi `/users/me` path'inde `GET` operasyonunu kullanın.
Kullanıcınızın verisini şöyle alırsınız:
@@ -264,11 +264,11 @@ Kilit ikonuna tıklayıp logout olursanız ve sonra aynı operasyonu tekrar dene
Şimdi pasif bir kullanıcıyla deneyin; şu bilgilerle authenticate olun:
-User: `alice`
+Kullanıcı: `alice`
Password: `secret2`
-Ve `/users/me` path’inde `GET` operasyonunu kullanmayı deneyin.
+Ve `/users/me` path'inde `GET` operasyonunu kullanmayı deneyin.
Şöyle bir "Inactive user" hatası alırsınız:
@@ -280,10 +280,10 @@ Ve `/users/me` path’inde `GET` operasyonunu kullanmayı deneyin.
## Özet { #recap }
-Artık API’niz için `username` ve `password` tabanlı, eksiksiz bir güvenlik sistemi implement etmek için gerekli araçlara sahipsiniz.
+Artık API'niz için `username` ve `password` tabanlı, eksiksiz bir güvenlik sistemi implement etmek için gerekli araçlara sahipsiniz.
Bu araçlarla güvenlik sistemini herhangi bir veritabanıyla ve herhangi bir user veya veri modeliyle uyumlu hale getirebilirsiniz.
Eksik kalan tek detay, bunun henüz gerçekten "güvenli" olmamasıdır.
-Bir sonraki bölümde güvenli bir password hashing kütüphanesini ve JWT token’larını nasıl kullanacağınızı göreceksiniz.
+Bir sonraki bölümde güvenli bir password hashing kütüphanesini ve JWT token'larını nasıl kullanacağınızı göreceksiniz.