You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

11 KiB

Yol Parametreleri ve Sayısal Doğrulamalar

Query ifadesi ile sorgu parametreleri için tanımladığınız doğrulamalar ve üstverileri aynı şekilde Path ifadesi için de tanımlayabilirsiniz.

Path İfadesini İçeri Aktaralım

Öncelikle, fastapi paketinden Path ifadesini ve sonra Annotated ifadesini içeri aktaralım:

=== "Python 3.10+"

```Python hl_lines="1  3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```

=== "Python 3.9+"

```Python hl_lines="1  3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="3-4"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```

=== "Python 3.10+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="1"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```

=== "Python 3.8+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```

!!! info "Bilgi" FastAPI, 0.95.0 versiyonu ile birlikte Annotated ifadesini desteklemeye (ve önermeye) başladı.

Daha eski bir sürüme sahipseniz `Annotated` ifadesini kullanırken hata alacaksınızdır.

`Annotated` ifadesini kullanmadan önce [FastAPI versiyon güncellemesini](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} en az 0.95.1 sürümüne getirdiğinizden emin olunuz.

Üstveri Tanımlayalım

Query ifadesinde geçerli olan tüm parametreleri kullanabilirsiniz.

Örneğin, item_id yol parametresi için title üstverisi tanımlamak adına şunu yazabilirsiniz:

=== "Python 3.10+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```

=== "Python 3.9+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```

=== "Python 3.10+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```

=== "Python 3.8+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```

!!! note "Not" Yol parametreleri, yolun bir parçası olduklarından dolayı her zaman zorunlu haldedirlerdir.

Bu nedenle, `...` ifadesini kullanarak onları zorunlu olarak damgalayabilirsiniz.

Yine de, parametreyi `None` ile tanımlamanıza veya parametreye varsayılan bir değer atamanıza rağmen parametre bunlardan etkilenmeyip her koşulda zorunlu kılınacaktır.

İhtiyaca Göre Parametreleri Sıralayalım

!!! tip "İpucu" Bu durum, Annotated kullandığınız şartlarda çok da önemli veya gerekli olmayacaktır.

Diyelim ki q sorgu parametresini zorunlu bir str olarak tanımlamak istiyorsunuz.

Ve o parametre için farklı bir tanımlama da yapmanıza gerek olmadığından dolayı Query ifadesine çok da gerek duymuyorsunuz.

Ama yine de, item_id yol parametresi için Path ifadesini kullanma ihtiyacı duyuyorsunuz ve bazı nedenlerden dolayı Annotated ifadesini kullanmak istemiyorsunuz.

Bu durumda, "varsayılan" değeri olmayan bir parametrenin önüne "varsayılan" değere sahip bir parametre koyarsanız Python huysuzlanacaktır.

Buna rağmen, varsayılan değersiz parametreyi (q sorgu parametresini) başa alacak şekilde yeniden sıralayabilirsiniz.

FastAPI için bu durumun bir önemi yoktur ve parametreleri isimlerine, tiplerine ve varsayılan tanımlamalarına (Query, Path, vb.) göre sıra fark etmeksizin ayırt edecektir.

Yani, fonksiyonunuzu bu şekilde tanımlayabilirsiniz:

=== "Python 3.8 Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="7"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```

Unutmamanız gerekir ki, bu tür bir problemi Annotated ifadesini kullanmayı tercih ederseniz Query() veya Path() ifadeleri için fonksiyon parametrelerinin varsayılan değerlerini kullanmadığınızdan dolayı yaşamayacaksınızdır.

=== "Python 3.9+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!}
```

İhtiyaca Göre Parametre Sıralamada Püf Noktalar

!!! tip "İpucu" Bu durum, Annotated kullandığınız şartlarda çok da önemli veya gerekli olmayacaktır.

İşte, kullanışlı olabilecek fakat sıkça kullanmayacağınız küçük bir püf nokta.

Eğer:

  • q sorgu parametresini Query ifadesi veya herhangi bir varsayılan değer olmadan tanımlamak,
  • item_id yol parametresini Path ifadesi ile tanımlamak,
  • bu parametrelere farklı sıralamayla sahip olmak,
  • ve Annotated ifadesini kullanmamak istiyorsanız

...Python'ın bu durum için özel bir sözdizimi vardır.

* simgesini, fonksiyonun ilk parametresi olarak geçebilirsiniz.

Python, * simgesi ile özel bir şey yapmayıp varsayılan değerleri olmasa bile ardından gelen parametrelerin, anahtar kelime argümanları (anahtar-değer eşleri) diğer bir deyişle kwargs olarak çağırılması gerektiğinin farkında olacaktır.

{!../../../docs_src/path_params_numeric_validations/tutorial003.py!}

Annotated ile Daha İyi

Eğer Annotated ifadesini kullanıyorsanız fonksiyon parametrelerinin varsayılan değerlerini kullanmayacağınızdan dolayı bu tarz bir probleme ve * simgesini kullanmaya ihtiyacınız kalmayacağını aklınızda bulundurabilirsiniz.

=== "Python 3.9+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```

Sayı Doğrulamaları: -dan Büyük veya Eşit

Query ve Path ifadeleri (ve ileride göreceğiniz diğerleri) ile sayı kısıtlamaları tanımlayabilirsiniz.

Burada, ge=1 ifadesi sayesinde item_id değeri, 1'den "büyük veya eşit" olmak zorunda kalacaktır.

=== "Python 3.9+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```

=== "Python 3.8+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```

Sayı Doğrulamaları: -dan Büyük ve -dan Küçük veya Eşit

Aynı kural şu ifadeler için de geçerlidir:

  • gt: -dan büyük
  • le: -dan küçük veya eşit

=== "Python 3.9+"

```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!}
```

=== "Python 3.8+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!}
```

Sayı Doğrulamaları: Float Sayılar, -dan Büyük ve -dan Küçük

Sayı doğrulamaları float değerler ile de kullanılabilir.

Sadece ge değil gt tanımlamasının da yapılabilmesinin önemli olduğu asıl kısım burasıdır. Örneğin, bu tanımlama ile birlikte bir değerin 1'den küçük olmasına rağmen 0'dan büyük olmasını zorunlu kılabilirsiniz.

Bu sayede, 0.5 değeri geçerli olurken 0.0 veya 0 değerleri olmayacaktır.

Aynı durum lt (-dan küçük) için de geçerlidir.

=== "Python 3.9+"

```Python hl_lines="13"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="12"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
```

=== "Python 3.8+ Annotated'sız"

!!! tip "İpucu"
    Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz.

```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
```

Özet

Query, Path ifadeleri (ve henüz görmediğiniz diğer ifadeler) ile birlikte Sorgu Parametreleri ve String Doğrulamaları{.internal-link target=_blank}'nda da olduğu gibi üstveri ve string doğrulamaları tanımlayabilirsiniz.

Ayrıca, sayısal doğrulamalar için de tanımlama yapabilirsiniz:

  • gt: -dan büyük
  • ge: -dan büyük veya eşit
  • lt: -dan küçük
  • le: -dan küçük veya eşit

!!! info "Bilgi" Query, Path ifadeleri ve ileride göreceğiniz diğer sınıflar Param ortak sınıfının alt sınıflarıdır.

Bunların hepsi, aşina olmuş olduğunuz ek doğrulama ve üstveri tanımlamaları için aynı parametrelerden faydalanır.

!!! note "Teknik Detaylar" Query, Path ifadeleri ve fastapi paketinden içeri aktarılan diğer ifadeler aslında birer fonksiyondur.

Bu fonksiyonlar çağrıldıkları zaman aynı isime sahip sınıfların örneklerini döndürürler.

Yani, fonksiyon olan `Query` ifadesini içeri aktarıp çağırdığınızda yine `Query` isminde bir sınıfın örneğini geri döndürür.

Bu fonksiyonlar (direkt olarak sınıf kullanımı yerine), editörünüzün onların tipleri hakkında hata tespit etmemesi adına mevcutta bulunurlar.

Bu sayede, bahsedilen hataları görmezden gelmek adına özel düzenlemeler yapmadan editörünüzü ve kod araçlarınızı kullanabilirsiniz.