committed by
GitHub
1 changed files with 309 additions and 0 deletions
@ -0,0 +1,309 @@ |
|||||
|
# Gövde - Çoklu Parametreler |
||||
|
|
||||
|
`Path` ve `Query` ifadelerinin kullanımına aşina olduğumuza göre hadi gelin istek gövdesi tanımlamalarının daha ileri kullanımlarını irdeleyelim. |
||||
|
|
||||
|
## `Path`, `Query` ve Gövde Parametrelerinin Bir Arada Kullanımı |
||||
|
|
||||
|
Her şeyden önce, `Path`, `Query` ve istek gövdesi parametre tanımlamaları özgürce bir arada kullanılabilir ve **FastAPI** bunlar ile ne yapması gerektiğinin bilincindedir. |
||||
|
|
||||
|
Ayrıca, `None` varsayılan ifadesi kullanılarak gövde parametreleri isteğe bağlı duruma getirilebilir: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="18-20" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="18-20" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+" |
||||
|
|
||||
|
```Python hl_lines="19-21" |
||||
|
{!> ../../../docs_src/body_multiple_params/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="17-19" |
||||
|
{!> ../../../docs_src/body_multiple_params/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="19-21" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! note "Not" |
||||
|
Dikkatinizi çekerim ki, bu durumda, `None` varsayılan değeri tanımlı olduğundan dolayı gövdeden alınacak olan `item` parametresi isteğe bağlıdır. |
||||
|
|
||||
|
## Çoklu Gövde Parametreleri |
||||
|
|
||||
|
Bir önceki örnekte, *yol operasyonları*, `Item` ifadesinin özniteliklerini kapsayan alttaki gibi bir JSON gövdesi bekliyor olurdu: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"name": "Foo", |
||||
|
"description": "The pretender", |
||||
|
"price": 42.0, |
||||
|
"tax": 3.2 |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Fakat, birden fazla gövde parametresi tanımı da yapılabilir, örneğin `item` ve `user`: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="20" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+" |
||||
|
|
||||
|
```Python hl_lines="22" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
Bu durumda, **FastAPI**, fonksiyonda birden fazla (Pydantic modelleri olan iki) gövde parametresi olduğunun farkına varacaktır. |
||||
|
|
||||
|
Böylece, daha sonra FastAPI, parametre adlarını gövdede anahtar (alan adları) olarak kullanacak ve şuna benzer bir gövde bekliyor olacaktır: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"item": { |
||||
|
"name": "Foo", |
||||
|
"description": "The pretender", |
||||
|
"price": 42.0, |
||||
|
"tax": 3.2 |
||||
|
}, |
||||
|
"user": { |
||||
|
"username": "dave", |
||||
|
"full_name": "Dave Grohl" |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
!!! note "Not" |
||||
|
Fark ettiyseniz, `item` ifadesi eskisi gibi tanımlanmasına rağmen şimdi gövdenin içerisinde `item` isminde bir anahtar olarak bekleniyor olacaktır. |
||||
|
|
||||
|
|
||||
|
**FastAPI**, `item` ve `user` ifadelerinin kendilerine özgü içerikleri edinmeleri için istek içerisinden otomatik dönüştürme yapacaktır. |
||||
|
|
||||
|
Ayrıca, bileşik verinin doğrulamasını gerçekleştirecek, otomatik dokümantasyon ve OpenAPI şemaları için dokümante edecektir. |
||||
|
|
||||
|
## Gövde İçinde Tekil Değerler |
||||
|
|
||||
|
Sorgu ve yol parametreleri için ek veri tanımlamak adına `Query` ve `Path` ifadeleri mevcutta bulunduğu gibi **FastAPI**, `Body` ifadesini de temin eder. |
||||
|
|
||||
|
Örneğin, önceki modeli genişleterek aynı gövde içerisinde `item` ve `user` ifadelerinin dışında `importance` adında başka bir ifadenin de yer alıp almamasını belirleyebilirsiniz. |
||||
|
|
||||
|
Eğer bu ifadeyi olduğu gibi yazarsanız ifade tekil değer olduğundan dolayı **FastAPI** ifadeyi bir sorgu parametresi olarak varsayacaktır. |
||||
|
|
||||
|
`Body` ifadesini kullanarak **FastAPI**'a, ifadeye bir gövde anahtarı olarak davranması gerektiğinin talimatını verebilirsiniz: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="23" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="23" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+" |
||||
|
|
||||
|
```Python hl_lines="24" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial003_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="20" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+ non-Annotated" |
||||
|
|
||||
|
!!! tip "İpucu" |
||||
|
Mümkün oldukça `Annotated`'lı versiyonu kullanmaya özen gösteriniz. |
||||
|
|
||||
|
```Python hl_lines="22" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial003.py!} |
||||
|
``` |
||||
|
|
||||
|
Bu durumda, **FastAPI** şuna benzer bir gövde bekliyor olacaktır: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"item": { |
||||
|
"name": "Foo", |
||||
|
"description": "The pretender", |
||||
|
"price": 42.0, |
||||
|
"tax": 3.2 |
||||
|
}, |
||||
|
"user": { |
||||
|
"username": "dave", |
||||
|
"full_name": "Dave Grohl" |
||||
|
}, |
||||
|
"importance": 5 |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Aynı şekilde, FastAPI veri tiplerini dönüştürür, doğrular, dokümante eder vb. |
||||
|
|
||||
|
## Çoklu Gövde ve Sorgu Parametreleri |
||||
|
|
||||
|
Ve elbette, ihtiyacınız oldukça herhangi bir gövde parametresine ek olarak sorgu parametreleri de tanımlayabilirsiniz. |
||||
|
|
||||
|
Tekil değerler varsayılan olarak sorgu parametreleri biçiminde değerlendirildiklerinden dolayı açıkça `Query` ifadesini eklemenize gerek yoktur, onun yerine şunu kullanabilirsiniz: |
||||
|
|
||||
|
```Python |
||||
|
q: Union[str, None] = None |
||||
|
``` |
||||
|
|
||||
|
Ya da, Python 3.10 veya daha üst versiyonlarda şunu: |
||||
|
|
||||
|
```Python |
||||
|
q: str | None = None |
||||
|
``` |
||||
|
|
||||
|
Örneğin: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="27" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="27" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+" |
||||
|
|
||||
|
```Python hl_lines="28" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial004_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="25" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial004_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="27" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial004.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! info "Bilgi" |
||||
|
`Body` ifadesi, `Query`, `Path` ve ileride göreceğiniz diğer ifadelerde geçerli olan bütün ek doğrulama ve üstveri parametrelerine de sahiptir. |
||||
|
|
||||
|
## Tek Gövde Parametresi Yerleştirmek |
||||
|
|
||||
|
Diyelim ki, `Item` isimli Pydantic modeli içerisinde `item` adında tek bir gövde parametresine sahipsiniz. |
||||
|
|
||||
|
Varsayılan olarak **FastAPI**, direkt olarak gövdesini bekliyor olacaktır. |
||||
|
|
||||
|
Ancak eğer, FastAPI'ın, `item` isminde bir anahtara sahip ve içerisinde ek gövde parametreleri tanımı yapıldığında olduğu gibi modelin içeriklerinin bulunduğu bir JSON bekliyor olmasını istiyorsanız özel `Body` parametresi olan `embed` ifadesini kullanabilirsiniz: |
||||
|
|
||||
|
```Python |
||||
|
item: Item = Body(embed=True) |
||||
|
``` |
||||
|
|
||||
|
şuradaki gibi: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="17" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="17" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.8+" |
||||
|
|
||||
|
```Python hl_lines="18" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial005_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="15" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial005_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="17" |
||||
|
{!> ../../../docs_src/body_multiple_params/tutorial005.py!} |
||||
|
``` |
||||
|
|
||||
|
Bu durumda, **FastAPI**, şunun gibi bir gövde bekliyor olacaktır: |
||||
|
|
||||
|
```JSON hl_lines="2" |
||||
|
{ |
||||
|
"item": { |
||||
|
"name": "Foo", |
||||
|
"description": "The pretender", |
||||
|
"price": 42.0, |
||||
|
"tax": 3.2 |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
bunun aksine: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"name": "Foo", |
||||
|
"description": "The pretender", |
||||
|
"price": 42.0, |
||||
|
"tax": 3.2 |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Özet |
||||
|
|
||||
|
Bir isteğin sadece tek bir gövdeye sahip olabilmesine rağmen *yol operasyon fonksiyonunuza* birden fazla gövde parametresi ekleyebilirsiniz. |
||||
|
|
||||
|
**FastAPI**, fonksiyonda doğru veriyi sağlayacak, *yol operasyonundaki* doğru şemayı doğruladıktan sonra dokümante edip her şeyin üstesinden gelecektir. |
||||
|
|
||||
|
Gövdenin bir parçası olarak değerlendirilmeleri adına tekil değerler de tanımlayabilirsiniz. |
||||
|
|
||||
|
Ve ayrıca, tek bir parametre tanımlandığı durumlarda bile **FastAPI**'a gövdeyi bir anahtarın içine yerleştirmesi gerektiğinin talimatını verebilirsiniz. |
Loading…
Reference in new issue