fastapi/docs/tr/docs/tutorial/body-multiple-params.md

5.2 KiB
Raw Blame History

Body - Birden Fazla Parametre

Artık Path ve Query kullanmayı gördüğümüze göre, request body bildirimlerinin daha ileri kullanım senaryolarına bakalım.

Path, Query ve body parametrelerini karıştırma

Öncelikle, elbette Path, Query ve request body parametre bildirimlerini serbestçe karıştırabilirsiniz ve FastAPI ne yapacağını bilir.

Ayrıca, varsayılan değeri None yaparak body parametrelerini opsiyonel olarak da tanımlayabilirsiniz:

{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}

/// note | Not

Bu durumda body'den alınacak item opsiyoneldir. Çünkü varsayılan değeri None olarak ayarlanmıştır.

///

Birden fazla body parametresi

Önceki örnekte, path operation'lar Item'ın özelliklerini içeren bir JSON body beklerdi, örneğin:

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

Ancak birden fazla body parametresi de tanımlayabilirsiniz; örneğin item ve user:

{* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *}

Bu durumda FastAPI, fonksiyonda birden fazla body parametresi olduğunu fark eder (iki parametre de Pydantic modelidir).

Bunun üzerine, body içinde anahtar (field name) olarak parametre adlarını kullanır ve şu şekilde bir body bekler:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    }
}

/// note | Not

item daha öncekiyle aynı şekilde tanımlanmış olsa bile, artık body içinde item anahtarı altında gelmesi beklenir.

///

FastAPI, request'ten otomatik dönüşümü yapar; böylece item parametresi kendi içeriğini alır, user için de aynı şekilde olur.

Birleşik verinin validasyonunu yapar ve OpenAPI şeması ile otomatik dokümantasyonda da bunu bu şekilde dokümante eder.

Body içinde tekil değerler

Query ve path parametreleri için ek veri tanımlamak üzere Query ve Path olduğu gibi, FastAPI bunların karşılığı olarak Body de sağlar.

Örneğin, önceki modeli genişleterek, aynı body içinde item ve user dışında bir de importance anahtarı olmasını isteyebilirsiniz.

Bunu olduğu gibi tanımlarsanız, tekil bir değer olduğu için FastAPI bunun bir query parametresi olduğunu varsayar.

Ama Body kullanarak, FastAPI'ye bunu body içinde başka bir anahtar olarak ele almasını söyleyebilirsiniz:

{* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *}

Bu durumda FastAPI şu şekilde bir body bekler:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    },
    "importance": 5
}

Yine veri tiplerini dönüştürür, validate eder, dokümante eder, vb.

Birden fazla body parametresi ve query

Elbette ihtiyaç duyduğunuzda, body parametrelerine ek olarak query parametreleri de tanımlayabilirsiniz.

Varsayılan olarak tekil değerler query parametresi olarak yorumlandığı için, ayrıca Query eklemeniz gerekmez; şöyle yazmanız yeterlidir:

q: Union[str, None] = None

Ya da Python 3.10 ve üzeri için:

q: str | None = None

Örneğin:

{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}

/// info | Bilgi

Body, Query, Path ve daha sonra göreceğiniz diğerleriyle aynı ek validasyon ve metadata parametrelerine de sahiptir.

///

Tek bir body parametresini gömme

Diyelim ki Pydantic'teki Item modelinden gelen yalnızca tek bir item body parametreniz var.

Varsayılan olarak FastAPI, body'nin doğrudan bu modelin içeriği olmasını bekler.

Ancak, ek body parametreleri tanımladığınızda olduğu gibi, item anahtarı olan bir JSON ve onun içinde modelin içeriğini beklemesini istiyorsanız, Body'nin özel parametresi olan embed'i kullanabilirsiniz:

item: Item = Body(embed=True)

yani şöyle:

{* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *}

Bu durumda FastAPI şu şekilde bir body bekler:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    }
}

şunun yerine:

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

Özet

Bir request yalnızca tek bir body içerebilse de, path operation function'ınıza birden fazla body parametresi ekleyebilirsiniz.

Ancak FastAPI bunu yönetir; fonksiyonunuza doğru veriyi verir ve path operation içinde doğru şemayı validate edip dokümante eder.

Ayrıca tekil değerlerin body'nin bir parçası olarak alınmasını da tanımlayabilirsiniz.

Ve yalnızca tek bir parametre tanımlanmış olsa bile, FastAPI'ye body'yi bir anahtarın içine gömmesini söyleyebilirsiniz.