///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»ΡΡ `model` Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ OpenAPI.
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²Ρ ΡΠ²Π½ΠΎ Π½Π΅ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ `responses`, FastAPI Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΠΎΡΠ²Π΅Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡ ΠΆΠ΅ ΡΠΈΠΏ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠ»Π°ΡΡ ΠΎΡΠ²Π΅ΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `application/json`).
Π Π²Π΅ΡΡΠΈΠΈ 0.118.0 ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΊΠΎΠ΄ ΠΏΠΎΡΠ»Π΅ `yield` Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΊ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π½ΠΈΠΆΠ΅, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΠΎ Π²Π΅ΡΡΠΈΠΈ 0.106.0, Π½ΠΎ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ ΠΊΡΠ°Π΅Π²ΡΡ
ΡΠ»ΡΡΠ°Π΅Π².
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `response_class` ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Β«ΡΠΈΠΏΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎΒ» ΠΎΡΠ²Π΅ΡΠ°.
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Content-Type`, ΡΡΠ°ΡΡΡ-ΠΊΠΎΠ΄ ΠΈ Ρ.Π΄. Π²ΠΎΠ·ΡΠΌΡΡΡΡ ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ° `Response`, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Π²Π΅ΡΠ½ΡΠ»ΠΈ.
ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ Pydantic-ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ. Π Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΡΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Pydantic.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ dataclasses Π½Π΅ ΡΠΌΠ΅ΡΡ Π²ΡΠ΅Π³ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΌΠ΅ΡΡ Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ.
ΠΠ΄Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΡ `shutdown` Π·Π°ΠΏΠΈΡΠ΅Ρ ΡΡΡΠΎΠΊΡ ΡΠ΅ΠΊΡΡΠ° `"Application shutdown"` Π² ΡΠ°ΠΉΠ» `log.txt`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π ΡΡΠ½ΠΊΡΠΈΠΈ `open()` ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `mode="a"` ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅Β» (append), ΡΠΎ Π΅ΡΡΡ ΡΡΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°, Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ.
ΠΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ, Π² ASGI-ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΡΠΎ ΡΠ°ΡΡΡ [ΠΡΠΎΡΠΎΠΊΠΎΠ»Π° Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), ΠΈ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠΈΡ `startup` ΠΈ `shutdown`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ `lifespan` Π² Starlette Π² [Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Starlette ΠΏΠΎ Lifespan](https://www.starlette.dev/lifespan/).
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΡΠΈΡ
ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ open source ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠ΅ ΡΠ°ΡΠΈΡΡ, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΈΡ
Π±Π΅Π· ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΡ
Π·Π°ΡΡΠ°Ρ. ΠΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ SDK Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΎΠ½Π»Π°ΠΉΠ½. π€
///
-ΠΡ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ
Π΄Π°Π½Π½ΡΡ
:
+Γ\92Γ\8b ΓΒΏΓΒΎΓΒ»Γ\83Γ\87ΓΒΈΓ\82ΓΒ΅ ΓΒΎΓ\88ΓΒΈΓΒ±ΓΒΊΓΒΈ ΓΒΏΓ\80Γ\8fΓΒΌΓΒΎ ΓΒ² Γ\80ΓΒ΅ΓΒ΄ΓΒ°ΓΒΊΓ\82ΓΒΎΓ\80ΓΒ΅ ΓΒΊΓΒΎΓΒ΄ΓΒ° ΓΒ΄ΓΒ»Γ\8f ΓΒΎΓ\82ΓΒΏΓ\80ΓΒ°ΓΒ²ΓΒ»Γ\8fΓΒ΅ΓΒΌΓ\8bΓ\85 ΓΒ΄ΓΒ°ΓΒ½ΓΒ½Γ\8bΓ\85:
<img src="/img/tutorial/generate-clients/image04.png">
npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
-ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ Π²Π°Ρ Π±ΡΠ΄ΡΡ **ΡΠΈΡΡΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²**, ΡΠΎ Π²ΡΠ΅ΠΌ **Π°Π²ΡΠΎΠ·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ**, **ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅** ΠΈ Ρ.Π΄.:
+ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ Π²Π°Ρ Π±ΡΠ΄ΡΡ **ΡΠΈΡΡΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²**, ΡΠΎ Π²ΡΠ΅ΠΌ **Π°Π²ΡΠΎΠ·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ**, **ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΊΠΎΠ΄Π°** ΠΈ Ρ.Π΄.:
<img src="/img/tutorial/generate-clients/image08.png">
* ΠΠ°Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠ° β Π² ΡΠ΅Π»Π΅ Π·Π°ΠΏΡΠΎΡΠ°, queryβΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ
ΠΈ Ρ.Π΄.
* ΠΠ°Π½Π½ΡΡ
ΠΎΡΠ²Π΅ΡΠ°.
-Π£ Π²Π°Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ **ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅** Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ.
+Π£ Π²Π°Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ **ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΊΠΎΠ΄Π°** Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ.
Π ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄ Π±ΡΠΊΠ΅Π½Π΄Π° ΠΈ **ΠΏΠ΅ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΠ΅** ΡΡΠΎΠ½ΡΠ΅Π½Π΄, Π² Π½ΡΠΌ ΠΏΠΎΡΠ²ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* ΠΊΠ°ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ΄Π°Π»Π΅Π½Ρ, Π° Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΡΠ°Π·ΡΡΡΡ Π² ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. π€
Π ΡΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ Ρ Π²Π°Ρ Π΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° (ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ *Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ* Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎ *Π²Π½Π΅ΡΠ½Π΅ΠΌ API*) Π² ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ².
-Π’Π΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `callbacks` Π² *Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ API*, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡ `.routes` (ΡΡΠΎ, ΠΏΠΎ ΡΡΡΠΈ, ΠΏΡΠΎΡΡΠΎ `list` ΠΌΠ°ΡΡΡΡΡΠΎΠ²/*ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΡΠΈ*) ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° ΠΎΠ±ΡΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ²:
+Π’Π΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `callbacks` Π² *Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ API*, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡ `.routes` ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° ΠΎΠ±ΡΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ²:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Π‘ΠΎΠ²Π΅Ρ
-ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠ΅ Π½Π΅ ΡΠ°ΠΌ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ (`invoices_callback_router`) Π² `callback=`, Π° Π΅Π³ΠΎ Π°ΡΡΠΈΠ±ΡΡ `.routes`, ΡΠΎ Π΅ΡΡΡ `invoices_callback_router.routes`.
+ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠ΅ Π½Π΅ ΡΠ°ΠΌ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ (`invoices_callback_router`) Π² `callback=`, Π° Π΅Π³ΠΎ Π°ΡΡΠΈΠ±ΡΡ `.routes`, ΡΠΎ Π΅ΡΡΡ `invoices_callback_router.routes`. FastAPI Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΌΠ°ΡΡΡΡΡΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ OpenAPI Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ².
///
ΠΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡ Π²Π°ΡΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡ
API Π΄Π»Ρ ΠΏΡΠΈΠ΅ΠΌΠ° Π²Π°ΡΠΈΡ
Π²Π΅Π±Ρ
ΡΠΊ-Π·Π°ΠΏΡΠΎΡΠΎΠ²; Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΌΠΎΠ³ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΡΠ²ΠΎΠ΅Π³ΠΎ API.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ΅Π±Ρ
ΡΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² OpenAPI 3.1.0 ΠΈ Π²ΡΡΠ΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π² FastAPI `0.99.0` ΠΈ Π½ΠΎΠ²Π΅Π΅.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π²Π°ΠΌΠΈ Π²Π΅Π±Ρ
ΡΠΊΠΈ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² ΡΡ
Π΅ΠΌΡ **OpenAPI** ΠΈ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ **ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ**.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ±ΡΠ΅ΠΊΡ `app.webhooks` Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ β ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ `APIRouter`, ΡΠΎΡ ΠΆΠ΅ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΏΡΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ.
### ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ *ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΡΠΈ* ΠΊΠ°ΠΊ operationId { #using-the-path-operation-function-name-as-the-operationid }
-ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΠΉ Π²Π°ΡΠΈΡ
API Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ `operationId`, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠΉΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΈΠ· Π½ΠΈΡ
ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ `operation_id` ΠΊΠ°ΠΆΠ΄ΠΎΠΉ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΡ
`APIRoute.name`.
+ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΠΉ Π²Π°ΡΠΈΡ
API Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ `operationId`, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ `generate_unique_id_function` Π² `FastAPI`.
-Γ\94ΓΒ΅ΓΒ»ΓΒ°Γ\82Γ\8c Γ\8dΓ\82ΓΒΎ Γ\81ΓΒ»ΓΒ΅ΓΒ΄Γ\83ΓΒ΅Γ\82 ΓΒΏΓΒΎΓ\81ΓΒ»ΓΒ΅ ΓΒ΄ΓΒΎΓΒ±ΓΒ°ΓΒ²ΓΒ»ΓΒ΅ΓΒ½ΓΒΈΓ\8f ΓΒ²Γ\81ΓΒ΅Γ\85 *ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86ΓΒΈΓΒΉ ΓΒΏΓ\83Γ\82ΓΒΈ*.
+ΓΒΓ\82ΓΒ° Γ\84Γ\83ΓΒ½ΓΒΊΓ\86ΓΒΈΓ\8f ΓΒΏΓΒΎΓΒ»Γ\83Γ\87ΓΒ°ΓΒ΅Γ\82 ΓΒΊΓΒ°ΓΒΆΓΒ΄Γ\8bΓΒΉ `APIRoute` ΓΒΈ ΓΒ²ΓΒΎΓΒ·ΓΒ²Γ\80ΓΒ°Γ\89ΓΒ°ΓΒ΅Γ\82 `operationId`, ΓΒΊΓΒΎΓ\82ΓΒΎΓ\80Γ\8bΓΒΉ ΓΒ½Γ\83ΓΒΆΓΒ½ΓΒΎ ΓΒΈΓ\81ΓΒΏΓΒΎΓΒ»Γ\8cΓΒ·ΓΒΎΓΒ²ΓΒ°Γ\82Γ\8c ΓΒ΄ΓΒ»Γ\8f Γ\8dΓ\82ΓΒΎΓΒΉ ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86ΓΒΈΓΒΈ ΓΒΏΓ\83Γ\82ΓΒΈ.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Π‘ΠΎΠ²Π΅Ρ
-
-ΠΡΠ»ΠΈ Π²Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ `app.openapi()` Π²ΡΡΡΠ½ΡΡ, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ `operationId` Π΄ΠΎ ΡΡΠΎΠ³ΠΎ.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ `Response` ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
`JSONResponse` ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠΌ `Response`.
- `instagram_basic` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Google.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π OAuth2 Β«scopeΒ» β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΎΠ±ΡΡΠ²Π»ΡΡΡΠ°Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
+/// note | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
`Security` Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠΌ `Depends` ΠΈ ΠΈΠΌΠ΅Π΅Ρ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΡΠΈΡΡΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΠΈ, Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² FastAPI 0.134.0.
Π Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠΊΠ» ΡΠΎΠ±ΡΡΠΈΠΉ), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΡΠ°ΡΡΡΡ Ρ Π΄ΠΈΡΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ· ΡΠ΅ΡΠΈ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ `io.BytesIO` ΡΠΆΠ΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ.
Π‘ ΡΡΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΡ Π±Π΅Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° `Content-Type` Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ΅ ΠΊΠ°ΠΊ JSON β ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΡΡ
Π²Π΅ΡΡΠΈΡΡ
FastAPI.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² FastAPI 0.132.0.
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ `HTTPException` Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `WebSocketException`.
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ `a2wsgi`, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `pip install a2wsgi`.
</div>
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΡ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ **Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²**, ΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ **ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ** (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ **Kubernetes**), ΡΠΎ Π²Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΠΌΠ΅ΡΡ **ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ**, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ **ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°Π³ΠΈ** Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΠΈ ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ **Π΄ΠΎ** Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²-Π²ΠΎΡΠΊΠ΅ΡΠΎΠ².
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Kubernetes, ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
# FastAPI Cloud { #fastapi-cloud }
-ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com) ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡΠ΅ΡΡ ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΅ΡΡ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎΠ³ΠΎ. π
-
-## ΠΡ
ΠΎΠ΄ { #login }
-
-Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ **FastAPI Cloud** (ΠΌΡ ΠΏΡΠΈΠ³Π»Π°ΡΠΈΠ»ΠΈ Π²Π°Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ π).
-
-ΠΠ°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π²Ρ
ΠΎΠ΄:
-
-<div class="termy">
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud π
-```
-
-</div>
-
-## ΠΠ΅ΠΏΠ»ΠΎΠΉ { #deploy }
-
-Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
+ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com) Π²ΡΠ΅Π³ΠΎ **ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ**. π
<div class="termy">
</div>
+CLI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI ΠΈ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Π΅Π³ΠΎ Π² ΠΎΠ±Π»Π°ΠΊΠ΅. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π²ΠΎΡΠ»ΠΈ Π² Π°ΠΊΠΊΠ°ΡΠ½Ρ, ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
+
ΠΠΎΡ ΠΈ Π²ΡΡ! Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠΎΠΌΡ URL. β¨
## Π FastAPI Cloud { #about-fastapi-cloud }
ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ³Π»ΡΠ±ΠΈΠΌΡΡ Π² Π΄Π΅ΡΠ°Π»ΠΈ.
-FastAPI ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ PythonβΠ²Π΅Π±βΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ² ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ <abbr title="Asynchronous Server Gateway Interface β ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΡΠ»ΡΠ·ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΅ΡΠ²Π΅ΡΠ°">ASGI</abbr>. FastAPI β ASGI-Π²Π΅Π±βΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ.
+FastAPI ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ PythonβΠ²Π΅Π±βΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ² ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ <abbr title="Asynchronous Server Gateway Interface - ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΡΠ»ΡΠ·ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΅ΡΠ²Π΅ΡΠ°">ASGI</abbr>. FastAPI β ASGI-Π²Π΅Π±βΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ.
ΠΠ»Π°Π²Π½ΠΎΠ΅, ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ **FastAPI** (ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ASGIβΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅) Π½Π° ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, β ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ASGIβΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠ°ΠΊΠ°Ρ ΠΊΠ°ΠΊ **Uvicorn**; ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `fastapi`.
* [Hypercorn](https://hypercorn.readthedocs.io/): ASGIβΡΠ΅ΡΠ²Π΅Ρ, ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠ΅Π³ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ HTTP/2 ΠΈ Trio.
* [Daphne](https://github.com/django/daphne): ASGIβΡΠ΅ΡΠ²Π΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ Django Channels.
* [Granian](https://github.com/emmett-framework/granian): HTTPβΡΠ΅ΡΠ²Π΅Ρ Π½Π° Rust Π΄Π»Ρ PythonβΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit β Π»ΡΠ³ΠΊΠ°Ρ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²Π΅Π±βΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
## Π‘Π΅ΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ΠΌΠ°ΡΠΈΠ½Π° ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° { #server-machine-and-server-program }
ΠΠ΄Π΅ΡΡ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ **Uvicorn** Ρ **Π²ΠΎΡΠΊΠ΅Ρ-ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ** ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρ `fastapi` ΠΈΠ»ΠΈ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρ `uvicorn`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Docker ΠΈΠ»ΠΈ Kubernetes, Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅: [FastAPI Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ
β Docker](docker.md).
* `openapi_version`: ΠΠ΅ΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ OpenAPI. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ: `3.1.0`.
* `summary`: ΠΡΠ°ΡΠΊΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ API.
* `description`: ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ API; ΠΌΠΎΠΆΠ΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Markdown ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
-* `routes`: Π‘ΠΏΠΈΡΠΎΠΊ ΠΌΠ°ΡΡΡΡΡΠΎΠ² β ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΡΠΈ*. ΠΠ΅ΡΡΡΡΡ ΠΈΠ· `app.routes`.
+* `routes`: Π‘ΠΏΠΈΡΠΎΠΊ ΠΌΠ°ΡΡΡΡΡΠΎΠ² β ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΡΠΈ*. ΠΠ΅ΡΡΡΡΡ ΠΈΠ· `app.routes`. FastAPI ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΡ
, ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ*, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ΅ ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΡΡ
ΡΠΎΡΡΠ΅ΡΠΎΠ².
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// tip | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
-ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `summary` Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² OpenAPI 3.1.0 ΠΈ Π²ΡΡΠ΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ FastAPI Π²Π΅ΡΡΠΈΠΈ 0.99.0 ΠΈ Π²ΡΡΠ΅.
+`app.routes` β ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠ°ΡΡΡΡΡΠΎΠ². ΠΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡ ΠΌΠ°ΡΡΡΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ FastAPI ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΡΡ
ΡΠΎΡΡΠ΅ΡΠΎΠ², Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ `APIRoute`.
+
+ΠΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ `app.routes` Π² `get_openapi()`. FastAPI ΠΎΠ±ΠΎΠΉΠ΄ΡΡ ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠ°ΡΡΡΡΡΠΎΠ², ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ.
+
+///
+
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
+
+ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `summary` Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² OpenAPI 3.1.0 ΠΈ Π²ΡΡΠ΅, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ FastAPI 0.99.0 ΠΈ Π²ΡΡΠ΅.
///
Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π² **FastAPI** Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `separate_input_output_schemas=False`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° `separate_input_output_schemas` ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π² FastAPI `0.102.0`. π€
### Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) { #deploy-your-app-optional }
-ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com), ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡΠ΅ΡΡ ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΅ΡΡ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎΠ³ΠΎ. π
-
-ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ **FastAPI Cloud** (ΠΌΡ ΠΏΡΠΈΠ³Π»Π°ΡΠΈΠ»ΠΈ Π²Π°Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ π), Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.
+ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com) ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ. π
<div class="termy">
</div>
+CLI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI ΠΈ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Π΅Π³ΠΎ Π² ΠΎΠ±Π»Π°ΠΊΠ΅. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π²ΠΎΡΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
+
ΠΠΎΡ ΠΈ Π²ΡΡ! Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅. β¨
#### Π FastAPI Cloud { #about-fastapi-cloud }
/// note | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
-Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π²Π½ΡΡΡΠΈ ΠΎΠ½ ΡΠΎΠ·Π΄Π°ΡΡ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΡΠΈ* Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ*, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΠΎΠΉ Π² `APIRouter`.
+FastAPI ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ `APIRouter` ΠΈ Π΅Π³ΠΎ `APIRoute` Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
-ΓΒ’ΓΒ°ΓΒΊ Γ\87Γ\82ΓΒΎ ΓΒΏΓΒΎΓΒ΄ ΓΒΊΓΒ°ΓΒΏΓΒΎΓ\82ΓΒΎΓΒΌ ΓΒ²Γ\81Γ\91 ΓΒ±Γ\83ΓΒ΄ΓΒ΅Γ\82 Γ\80ΓΒ°ΓΒ±ΓΒΎΓ\82ΓΒ°Γ\82Γ\8c Γ\82ΓΒ°ΓΒΊ, ΓΒΊΓΒ°ΓΒΊ ΓΒ±Γ\83ΓΒ΄Γ\82ΓΒΎ ΓΒ²Γ\81Γ\91 ΓΒ±Γ\8bΓΒ»ΓΒΎ ΓΒΎΓΒ΄ΓΒ½ΓΒΈΓΒΌ ΓΒΏΓ\80ΓΒΈΓΒ»ΓΒΎΓΒΆΓΒ΅ΓΒ½ΓΒΈΓΒ΅ΓΒΌ.
+ΓΒΓ\82ΓΒΎ ΓΒΎΓΒ·ΓΒ½ΓΒ°Γ\87ΓΒ°ΓΒ΅Γ\82, Γ\87Γ\82ΓΒΎ ΓΒΏΓΒΎΓΒ»Γ\8cΓΒ·ΓΒΎΓΒ²ΓΒ°Γ\82ΓΒ΅ΓΒ»Γ\8cΓ\81ΓΒΊΓΒΈΓΒ΅ ΓΒΏΓΒΎΓΒ΄ΓΒΊΓΒ»ΓΒ°Γ\81Γ\81Γ\8b `APIRouter` ΓΒΈ `APIRoute` ΓΒΏΓΒΎ-ΓΒΏΓ\80ΓΒ΅ΓΒΆΓΒ½ΓΒ΅ΓΒΌΓ\83 Γ\83Γ\87ΓΒ°Γ\81Γ\82ΓΒ²Γ\83Γ\8eΓ\82 ΓΒΏΓΒΎΓ\81ΓΒ»ΓΒ΅ ΓΒΏΓΒΎΓΒ΄ΓΒΊΓΒ»Γ\8eΓ\87ΓΒ΅ΓΒ½ΓΒΈΓ\8f ΓΒΌΓΒ°Γ\80Γ\88Γ\80Γ\83Γ\82ΓΒΈΓΒ·ΓΒ°Γ\82ΓΒΎΓ\80ΓΒ°.
///
ΠΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠΎΠ² Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
-ΠΡΠΎ Π·Π°ΠΉΠΌΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅.
+ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π»ΡΠ³ΠΊΠΈΠΌ ΠΈ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ
ΡΠ°ΡΡ
ΠΎΠ΄ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ.
Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. β‘
`APIRouter` Π½Π΅ Β«ΠΌΠΎΠ½ΡΠΈΡΡΡΡΡΡΒ», ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Ρ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
-ΠΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Π² OpenAPI-ΡΡ
Π΅ΠΌΡ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ.
+ΠΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Π² ΡΡ
Π΅ΠΌΡ OpenAPI ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ.
-Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
ΠΈ Β«ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡΒ» Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ, *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Β«ΠΊΠ»ΠΎΠ½ΠΈΡΡΡΡΡΡΒ» (ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°ΡΡΡΡ), Π° Π½Π΅ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ.
+FastAPI ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΠ΅Ρ ΠΏΡΠ΅ΡΠΈΠΊΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠΎΠ², Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΡΠ΅Π³ΠΈ, ΠΎΡΠ²Π΅ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ OpenAPI.
///
ΠΡΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ, Π½ΠΎ ΠΎΠ½ΠΎ Π΅ΡΡΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ.
-## ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ `APIRouter` Π² Π΄ΡΡΠ³ΠΎΠΉ `APIRouter` { #include-an-apirouter-in-another }
+## ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ `APIRouter` Π² Π΄ΡΡΠ³ΠΎΠΉ `APIRouter` { #include-an-apirouter-in-another }
Π’ΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ `APIRouter` ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ `FastAPI`, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ `APIRouter` ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ `APIRouter`, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
router.include_router(other_router)
```
-Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ Π΄ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ `router` ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ `FastAPI`, ΡΡΠΎΠ±Ρ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* ΠΈΠ· `other_router` ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ.
+ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π΄ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ `router` ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ `FastAPI`. FastAPI Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* ΠΈΠ· `other_router` Π² ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΈ OpenAPI.
+
+Π’ΠΎ ΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌ ΠΏΡΡΠΈ*, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΌ ΠΏΠΎΠ·ΠΆΠ΅ Π² ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΡ. ΠΠ½ΠΈ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ Π²ΠΈΠ΄Π½Ρ ΡΠ΅ΡΠ΅Π· Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½Π΅Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
+
+/// warning | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
+
+ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΠΏΡΡΠΌΠΎΠΉ ΠΌΡΡΠ°ΡΠΈΠΈ `router.routes` ΠΏΠΎΡΠ»Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ°. FastAPI ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° ΠΊΠ°ΠΊ Β«ΠΆΠΈΠ²ΠΎΠ΅Β», ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ ΠΈ Π΅Π³ΠΎ ΠΌΠ°ΡΡΡΡΡΡ ΠΎΡΡΠ°ΡΡΡΡ ΡΠ°ΡΡΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ OpenAPI.
+
+ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ API, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΡΠΈ ΠΈ `.include_router()`, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΌΠ°ΡΡΡΡΡΡ ΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΡ.
+
+Π‘ΡΠΈΡΠ°ΠΉΡΠ΅ `router.routes` Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌ Π΄Π΅ΡΠ΅Π²ΠΎΠΌ ΠΌΠ°ΡΡΡΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΈ Π²ΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΡ, ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ»ΠΎΡΠΊΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈΡΠΎΠ³ΠΎΠ²ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΡΠΈ.
+
+///
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
`Body` ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π²ΡΠ΅ ΡΠ΅ ΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΊ Ρ `Query`, `Path` ΠΈ Π΄ΡΡΠ³ΠΈΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π» JSON Ρ ΠΊΠ»ΡΡΠΎΠΌ `item` Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Π½ΡΡΡΠΈ, ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
body-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `embed` Ρ ΡΠΈΠΏΠ° `Body`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
### ΠΠ±ΡΡΠ²ΠΈΡΠ΅ `list` Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΈΠΏΠ° { #declare-a-list-with-a-type-parameter }
-ΠΠ»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΡ
Π΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ° (Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠΈΠΏΡ), ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ `list`, `dict`, `tuple`, ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ(ΠΈΠ΅) ΡΠΈΠΏ(Ρ) ΠΊΠ°ΠΊ Β«ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ°Β», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ: `[` ΠΈ `]`
+ΠΠ»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΡ
Π΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ° (Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠΈΠΏΡ), ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ `list`, `dict`, `tuple`,
+ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ(ΠΈΠ΅) ΡΠΈΠΏ(Ρ) ΠΊΠ°ΠΊ Β«ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ°Β», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ: `[` ΠΈ `]`
```Python
my_list: list[str]
}
```
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Ρ ΠΊΠ»ΡΡΠ° `images` Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° `Offer` Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² `Item`, ΠΊΠΎΡΠΎΡΡΠ΅, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² `Image`
Π§ΡΠΎΠ±Ρ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠ΅Π»ΠΎ **Π·Π°ΠΏΡΠΎΡΠ°**, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ [Pydantic](https://docs.pydantic.dev/), ΡΠΎ Π²ΡΠ΅ΠΉ ΠΈΡ
ΠΌΠΎΡΡΡ ΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
Π§ΡΠΎΠ±Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²: `POST` (ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ), `PUT`, `DELETE` ΠΈΠ»ΠΈ `PATCH`.
<img src="/img/tutorial/cookie-param-models/image01.png">
</div>
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ **Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ cookies** ΠΎΡΠΎΠ±ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ, ΠΎΠ½ΠΈ **Π½Π΅** ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ **JavaScript** Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½ΠΈΠΌ.
///
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ cookies, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `Cookie`, ΠΈΠ½Π°ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±ΡΠ΄ΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π°ΠΏΡΠΎΡΠ°.
///
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ **Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ cookies** ΠΎΡΠΎΠ±ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ Β«Π·Π° ΠΊΡΠ»ΠΈΡΠ°ΠΌΠΈΒ», ΠΎΠ½ΠΈ **Π½Π΅** ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ **JavaScript** ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊ Π½ΠΈΠΌ Π΄ΠΎΡΡΡΠΏ.
Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π°.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ [ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ Python](https://docs.python.org/3/library/__main__.html).
///
-/// info | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΠ΄ΡΠΌΠ°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ `X-Key` ΠΈ `X-Token`.
end
```
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»ΠΈΠ΅Π½ΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ ΡΠΎΠ»ΡΠΊΠΎ **ΠΎΠ΄ΠΈΠ½ ΠΎΡΠ²Π΅Ρ**. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΎΡΠ²Π΅Ρ ΠΎΡ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ*.
Note over dep_req: ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π΄ΠΎ yield
dep_req ->> dep_func: ΠΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Note over dep_func: ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π΄ΠΎ yield
- dep_func ->> operation: ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΡΡΠΈ
+ dep_func ->> operation: ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΡΠΈ
operation ->> dep_func: ΠΡΡ
ΠΎΠ΄ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΡΠΈ
Note over dep_func: ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠ΄ ΠΏΠΎΡΠ»Π΅ yield
Note over dep_func: β
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π·Π°ΠΊΡΡΡΠ°
Π Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ `dict`, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
FastAPI Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ `Annotated` (ΠΈ Π½Π°ΡΠ°Π» ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅) Π² Π²Π΅ΡΡΠΈΠΈ 0.95.0.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π° **FastAPI** ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎ Π΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Π΅ Π΄Π»Ρ Π²Π°ΡΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΡΠΈ*.
-/// check | ΠΡΠΎΠ²Π΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΅Π³ΠΎ ΠΊΡΠ΄Π°-ΡΠΎ Π² **FastAPI**, ΡΡΠΎΠ±Ρ Β«Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΒ» Π΅Π³ΠΎ ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.
**FastAPI** ΡΠ°ΠΌ Π·Π°ΠΉΠΌΡΡΡΡ ΠΈΡ
ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ.
-## ΠΠ΅ΡΠ²Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ { #first-dependency-dependable }
+## ΠΠ΅ΡΠ²Π°Ρ Β«Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΒ» { #first-dependency-dependable }
-ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
+ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΡ Β«Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΒ» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² *ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* - `query_or_cookie_extractor`.
from backend.main import app
```
-### `fastapi dev` Ρ ΠΏΡΡΡΠΌ { #fastapi-dev-with-path }
+### `fastapi dev` Ρ ΠΏΡΡΡΠΌ ΠΈΠ»ΠΈ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ `fastapi dev`, ΠΈ ΠΎΠ½Π° ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ FastAPI Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
$ fastapi dev main.py
```
-ΠΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ `fastapi`.
-
-ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ [Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ VS Code](../editor-support.md) ΠΈΠ»ΠΈ [FastAPI Cloud](https://fastapicloud.com), ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `entrypoint` Π² `pyproject.toml`.
-
-### Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ) { #deploy-your-app-optional }
-
-ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com), ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΠ΅ΡΡ ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΅ΡΡ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎΠ³ΠΎ. π
-
-ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ **FastAPI Cloud** (ΠΌΡ ΠΏΡΠΈΠ³Π»Π°ΡΠΈΠ»ΠΈ Π²Π°Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ π), Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.
-
-ΠΠ΅ΡΠ΅Π΄ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ Π²ΠΎΡΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ:
-
-<div class="termy">
+ΠΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠΏΡΠΈΡ `--entrypoint` ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `fastapi dev`:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud π
+$ fastapi dev --entrypoint main:app
```
-</div>
+ΠΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ/entrypoint ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ `fastapi`.
+
+ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ [Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ VS Code](../editor-support.md) ΠΈΠ»ΠΈ [FastAPI Cloud](https://fastapicloud.com), ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `entrypoint` Π² `pyproject.toml`.
-ΠΠ°ΡΠ΅ΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
+### Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ) { #deploy-your-app-optional }
+
+ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² [FastAPI Cloud](https://fastapicloud.com) ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ. π
<div class="termy">
</div>
+CLI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI ΠΈ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Π΅Π³ΠΎ Π² ΠΎΠ±Π»Π°ΠΊΠ΅. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π²ΠΎΡΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
+
ΠΠΎΡΠΎΠ²ΠΎ! Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠΎΠΌΡ URL. β¨
## Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΡΡΠ°ΠΏΠ½ΠΎ { #recap-step-by-step }
/items/foo
```
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Β«ΠΡΡΡΒ» ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ Β«ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΒ» ΠΈΠ»ΠΈ Β«ΠΌΠ°ΡΡΡΡΡΒ».
* ΠΏΠΎ ΠΏΡΡΠΈ `/`
* Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ <dfn title="ΠΌΠ΅ΡΠΎΠ΄ HTTP GET"><code>get</code> ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ</dfn>
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ `@decorator`
+/// note | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ `@decorator`
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ `@something` Π² Python Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΒ».
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π£Π·Π½Π°ΠΉΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΡΠ΅Π³Π°Ρ
Π² [ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ](path-operation-configuration.md#tags).
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ `response_description` ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΊ ΠΎΡΠ²Π΅ΡΡ, Π° `description` ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Π² ΡΠ΅Π»ΠΎΠΌ.
///
-/// check | ΠΡΠΎΠ²Π΅ΡΠΊΠ°
+/// tip | Π‘ΠΎΠ²Π΅Ρ
OpenAPI ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ* Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ°.
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° `Annotated` Π±ΡΠ»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² FastAPI Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 0.95.0 (ΠΈ Ρ ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄).
* `lt`: ΠΌΠ΅Π½ΡΡΠ΅ (`l`ess `t`han)
* `le`: ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π½ΠΎ (`l`ess than or `e`qual)
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
`Query`, `Path` ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΡΠ°Π·Π±Π΅ΡΡΡΠ΅ ΠΏΠΎΠ·ΠΆΠ΅, ΡΠ²Π»ΡΡΡΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ°ΠΌΠΈ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° `Param`.
ΠΠ΄Π΅ΡΡ, `item_id` ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΠΈΠΏΠΎΠΌ `int`.
-/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΠΊΠΎΠ΄Π° Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ, Π°Π²ΡΠΎΠ·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Ρ.ΠΏ.).
{"item_id":3}
```
-/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `3`, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»Π° (ΠΈ Π²Π΅ΡΠ½ΡΠ»Π°) ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠΎ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Python `int`, Π° Π½Π΅ ΡΡΡΠΎΠΊΠ° `"3"`.
Π’Π° ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ, Π΅ΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ `int` ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ `float`, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
**FastAPI** ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΡ ΡΠ΅ ΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ².
<img src="/img/tutorial/path-params/image01.png">
-/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
ΠΡΡ ΡΠ°Π·, ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², **FastAPI** ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ (Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠ΅ΠΉ Swagger UI).
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° `Annotated` (ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ) ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π² FastAPI Π²Π΅ΡΡΠΈΠΈ 0.95.0.
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π² Pydantic Π²Π΅ΡΡΠΈΠΈ 2 ΠΈ Π²ΡΡΠ΅. π
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `q` Π±ΡΠ΄Π΅Ρ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `None` ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
-/// check | ΠΠ°ΠΆΠ½ΠΎ
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ **FastAPI** Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΌΡΠ½ ΡΡΠΎΠ±Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `item_id` ΡΠ²Π»ΡΠ΅ΡΡΡ path-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ, Π° `q` Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π·Π°ΠΏΡΠΎΡΠ°.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ»Π°ΡΡ `File`, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`python-multipart`](https://github.com/Kludex/python-multipart).
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
`File` - ΡΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ `Form`.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ **Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ** Π΄Π»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ **ΠΏΠΎΠ»Π΅ΠΉ ΡΠΎΡΠΌΡ** Π² FastAPI.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΡ, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`python-multipart`](https://github.com/Kludex/python-multipart).
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ `File` ΠΈ `Form`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ/ΠΈΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡΠΌ, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`python-multipart`](https://github.com/Kludex/python-multipart).
ΠΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ JSON, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `Form`.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΡ, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`python-multipart`](https://github.com/Kludex/python-multipart).
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ `Form` Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠ΅ ΠΆΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΡΡΠΎ ΠΈ Ρ `Body` (ΠΈ `Query`, `Path`, `Cookie`), Π²ΠΊΠ»ΡΡΠ°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ, ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, `user-name` Π²ΠΌΠ΅ΡΡΠΎ `username`) ΠΈ Ρ.Π΄.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
`Form` β ΡΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ `Body`.
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `EmailStr`, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`email-validator`](https://github.com/JoshData/python-email-validator).
-Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ [Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅](../virtual-environments.md), Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
+Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ [Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅](../virtual-environments.md), Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
```console
$ pip install email-validator
## ΠΡΡΠ³ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ
ΡΠΈΠΏΠΎΠ² { #other-return-type-annotations }
-ΠΡΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ Pydantic, ΠΈ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΡΡΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π΄ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² (ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΊΠΎΠ΄Π°, mypy ΠΈ Ρ.Π΄.).
+ΠΡΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ Pydantic, ΠΈ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΡΡΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π΄ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² (ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΊΠΎΠ΄Ρ, mypy ΠΈ Ρ.Π΄.).
### ΠΠΎΠ·Π²ΡΠ°Ρ Response Π½Π°ΠΏΡΡΠΌΡΡ { #return-a-response-directly }
}
```
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `status_code` ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ HTTP ΡΡΠ°ΡΡΡ-ΠΊΠΎΠ΄.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `status_code` ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ `IntEnum`, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) Π² Python.
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
OpenAPI 3.1.0 (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π°ΡΠΈΠ½Π°Ρ Ρ FastAPI 0.99.0) Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ `examples`, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ° **JSON Schema**.
* `File()`
* `Form()`
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠΎΡ ΡΡΠ°ΡΡΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ Π΄Π»Ρ OpenAPI ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `examples` ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ `openapi_examples`, Π½Π°ΡΠΈΠ½Π°Ρ Ρ FastAPI `0.103.0`.
ΠΡΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ `examples` Π² JSON Schema β ΡΡΠΎ **ΠΏΡΠΎΡΡΠΎ `list`** ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², Π° Π½Π΅ dict Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠ°ΠΊ Π² Π΄ΡΡΠ³ΠΈΡ
ΠΌΠ΅ΡΡΠ°Ρ
OpenAPI (ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ
Π²ΡΡΠ΅).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ OpenAPI 3.1.0 Π±ΡΠ»Π° Π²ΡΠΏΡΡΠ΅Π½Π° Ρ ΡΡΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ, Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠ΅ΠΉ Ρ JSON Schema, ΠΊΠ°ΠΊΠΎΠ΅βΡΠΎ Π²ΡΠ΅ΠΌΡ Swagger UI, ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π» OpenAPI 3.1.0 (ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 5.0.0 π).
## ΠΠ°ΠΏΡΡΠΊ { #run-it }
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΊΠ΅Ρ [`python-multipart`](https://github.com/Kludex/python-multipart) Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ **FastAPI**, Π΅ΡΠ»ΠΈ Π²Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ `pip install "fastapi[standard]"`.
<img src="/img/tutorial/security/image01.png">
-/// check | ΠΠ½ΠΎΠΏΠΊΠ° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ!
+/// tip | ΠΠ½ΠΎΠΏΠΊΠ° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ!
Π£ Π²Π°Ρ ΡΠΆΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π½ΠΎΠ²Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ° Β«AuthorizeΒ».
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ **OAuth2**, Ρ ΠΏΠΎΡΠΎΠΊΠΎΠΌ **Password**, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠΊΠ΅Π½ **Bearer**. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡ `OAuth2PasswordBearer`.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π’ΠΎΠΊΠ΅Π½ Β«bearerΒ» β Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
Π‘ΠΊΠΎΡΠΎ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΈ ΡΠ°ΠΌΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΡΠΈ.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²Ρ ΠΎΡΠ΅Π½Ρ ΡΡΡΠΎΠ³ΠΈΠΉ Β«ΠΏΠΈΡΠΎΠ½ΠΈΡΡΒ», Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΡΡΡΡ ΡΡΠΈΠ»Ρ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `tokenUrl` Π²ΠΌΠ΅ΡΡΠΎ `token_url`.
**FastAPI** Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Β«ΡΡ
Π΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈΒ» Π² ΡΡ
Π΅ΠΌΠ΅ OpenAPI (ΠΈ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ API).
-/// info | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
+/// note | Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
**FastAPI** Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ `OAuth2PasswordBearer` (ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ) Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡ
Π΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² OpenAPI, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ `fastapi.security.oauth2.OAuth2`, ΠΊΠΎΡΠΎΡΡΠΉ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ `fastapi.security.base.SecurityBase`.
## Π§ΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ { #what-it-does }
-ΠΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Authorization`, ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΡΡΠΎ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ `Bearer ` ΠΏΠ»ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΊΠ΅Π½, ΠΈ Π²Π΅ΡΠ½Π΅Ρ ΡΠΎΠΊΠ΅Π½ ΠΊΠ°ΠΊ `str`.
+ΠΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Authorization`, ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΡΡΠΎ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ `Bearer ` ΠΏΠ»ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΊΠ΅Π½, ΠΈ Π²Π΅ΡΠ½Π΅Ρ ΡΠΎΠΊΠ΅Π½ ΠΊΠ°ΠΊ `str`.
ΠΡΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Authorization` ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠΊΠ΅Π½ `Bearer `, ΠΎΠ½ ΡΡΠ°Π·Ρ ΠΎΡΠ²Π΅ΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ ΡΠΎ ΡΡΠ°ΡΡΡ-ΠΊΠΎΠ΄ΠΎΠΌ 401 (`UNAUTHORIZED`).
## ΠΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ { #get-the-user }
-`get_current_user` Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π½Π°ΠΌΠΈ (Π½Π΅Π½Π°ΡΡΠΎΡΡΡΡ) ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠΊΠ΅Π½ ΡΠΈΠΏΠ° `str` ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΡΡ Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ `User`:
+`get_current_user` Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π½Π°ΠΌΠΈ (Π½Π΅Π½Π°ΡΡΠΎΡΡΡΡ) Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠΊΠ΅Π½ ΡΠΈΠΏΠ° `str` ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΡΡ Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ `User`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
///
-/// check | ΠΠ°ΠΌΠ΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
Π’ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½Π° ΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ `User`.
## Π Π°Π·ΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° { #code-size }
-ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΡΠΌ. ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΌΡ ΡΠΌΠ΅ΡΠΈΠ²Π°Π΅ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ, ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½ΡΡ
, ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ*.
+ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΡΠΌ. ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΌΡ ΡΠΌΠ΅ΡΠΈΠ²Π°Π΅ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ, ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½ΡΡ
, Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ *ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΡΠΈ*.
ΠΠΎ Π²ΠΎΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
</div>
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ RSA ΠΈΠ»ΠΈ ECDSA, Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ `pyjwt[crypto]`.
Username: `johndoe`
Password: `secret`
-/// check | ΠΡΠΎΠ²Π΅ΡΠΊΠ°
+/// tip | ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½ΠΈΠ³Π΄Π΅ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΠ°ΡΠΎΠ»Ρ "`secret`", ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ.
* `instagram_basic` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Google.
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π OAuth2 "scope" β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π»ΠΈ ΠΎΠ½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ `:`, ΠΈΠ»ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎ URL.
* ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ `client_id` (Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠ½ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ).
* ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ `client_secret` (Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠ½ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ).
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
`OAuth2PasswordRequestForm` β ΡΡΠΎ Π½Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ **FastAPI**, ΠΊΠ°ΠΊ `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ **FastAPI**, ΡΡΠΎ ΡΡΠΎ ΡΡ
Π΅ΠΌΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½Π° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π² OpenAPI ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
)
```
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ `**user_dict` ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² [Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ **ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΌΠΎΠ΄Π΅Π»ΡΠΌ**](../extra-models.md#about-user-in-dict).
///
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `WWW-Authenticate` ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ `Bearer`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π΄Π΅ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ, ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΡΠ±ΠΎΠΉ HTTP ΡΡΠ°ΡΡΡ-ΠΊΠΎΠ΄ 401 "UNAUTHORIZED" Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `WWW-Authenticate`.
ΠΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° [Π‘ΡΡΠΈΠΌΠΈΠ½Π³ JSON Lines](stream-json-lines.md), Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΡΠΌΠ°Ρ `text/event-stream`, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² FastAPI 0.135.0.
/// tip | Π‘ΠΎΠ²Π΅Ρ
-ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠΈΠΌΠΈΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ»ΠΈ Π°ΡΠ΄ΠΈΠΎ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ: [Stream Data](../advanced/stream-data.md).
+ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠΈΠΌΠΈΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ»ΠΈ Π°ΡΠ΄ΠΈΠΎ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ: [ΠΠΎΡΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ
](../advanced/stream-data.md).
///
FastAPI ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΄Π»Ρ SSE.
-- ΠΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Β«pingΒ» Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (Β«keep aliveΒ») ΠΊΠ°ΠΆΠ΄ΡΠ΅ 15 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΎΠΊΡΠΈ, ΠΊΠ°ΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π² [HTML specification: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
+- ΠΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Β«pingΒ» Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (Β«keep aliveΒ») ΠΊΠ°ΠΆΠ΄ΡΠ΅ 15 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΎΠΊΡΠΈ, ΠΊΠ°ΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π² [Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ HTML: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Cache-Control: no-cache`, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°.
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `X-Accel-Buffering: no`, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΏΡΠΎΠΊΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Nginx.
Π£ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π² Β«**ΠΏΠΎΡΠΎΠΊΠ΅**Β». ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ **JSON Lines**.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² FastAPI 0.134.0.
ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° JSON-ΠΌΠ°ΡΡΠΈΠ² (ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ ΡΠΏΠΈΡΠΊΠ° Python), Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π±ΡΡΡ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΌ Π² `[]` ΠΈ ΠΈΠΌΠ΅ΡΡ `,` ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π·Π΄Π΅ΡΡ **ΠΎΠ΄ΠΈΠ½ JSON-ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π° ΡΡΡΠΎΠΊΡ**, ΠΎΠ½ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΡΠΎΠΊΡ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ.
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° `TestClient` { #using-testclient }
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° `TestClient` ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ [`httpx`](https://www.python-httpx.org).
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π΄Π°Π½Π½ΡΡ
Π½Π° Π±ΡΠΊΠ΅Π½Π΄ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `httpx` ΠΈΠ»ΠΈ `TestClient` ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ [Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ HTTPX](https://www.python-httpx.org).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
+/// note | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ `TestClient` ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² JSON, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Pydantic.