///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ»ΡΡ `model` Π½Π΅ Ρ ΡΠ°ΡΡΠΈΠ½ΠΎΡ OpenAPI.
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΎΠΊΠΈ Π²ΠΈ ΡΠ²Π½ΠΎ Π½Π΅ Π²ΠΊΠ°ΠΆΠ΅ΡΠ΅ ΡΠ½ΡΠΈΠΉ ΡΠΈΠΏ ΠΌΠ΅Π΄ΡΠ° Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ `responses`, FastAPI Π²Π²Π°ΠΆΠ°ΡΠΈΠΌΠ΅, ΡΠΎ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ ΠΌΠ°Ρ ΡΠΎΠΉ ΡΠ°ΠΌΠΈΠΉ ΡΠΈΠΏ ΠΌΠ΅Π΄ΡΠ°, ΡΠΎ ΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΠΉ ΠΊΠ»Π°Ρ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ (ΡΠΈΠΏΠΎΠ²ΠΎ `application/json`).
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *}
-/// tip | ΠΠΎΡΠ°Π΄Π°
+/// tip
Π£ΡΠ΅ ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π·Π΄Π°Π²Π°ΡΠΈΡΡ Π½Π°Π΄ΡΠΌΠ°Π½ΠΈΠΌ. Π ΠΏΠΎΠΊΠΈ ΡΠΎ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π½Π΅ Π΄ΡΠΆΠ΅ Π·ΡΠΎΠ·ΡΠΌΡΠ»ΠΎ, Π½Π°Π²ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ.
## ΠΠ°Π»Π΅ΠΆΠ½ΠΎΡΡΡ Π· `yield`, `HTTPException`, `except` ΡΠ° ΡΠΎΠ½ΠΎΠ²ΠΈΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ { #dependencies-with-yield-httpexception-except-and-background-tasks }
-/// warning | ΠΠΎΠΏΠ΅ΡΠ΅Π΄ΠΆΠ΅Π½Π½Ρ
+/// warning
ΠΠ°ΠΉΡΠΌΠΎΠ²ΡΡΠ½ΡΡΠ΅, Π²Π°ΠΌ Π½Π΅ Π·Π½Π°Π΄ΠΎΠ±Π»ΡΡΡΡΡ ΡΡ ΡΠ΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ.
Π¦Ρ ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΠΊΡ Π·ΠΌΡΠ½Π΅Π½ΠΎ Ρ 0.118.0: Π·Π°Π²Π΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡΡΠ»Ρ `yield` Π·Π½ΠΎΠ²Ρ Π²ΠΈΠΊΠΎΠ½ΡΡΡΡΡΡ ΠΏΡΡΠ»Ρ Π²ΡΠ΄ΠΏΡΠ°Π²Π»Π΅Π½Π½Ρ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note
Π―ΠΊ ΠΏΠΎΠ±Π°ΡΠΈΡΠ΅ Π½ΠΈΠΆΡΠ΅, ΡΠ΅ Π΄ΡΠΆΠ΅ ΡΡ
ΠΎΠΆΠ΅ Π½Π° ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΠΊΡ Π΄ΠΎ Π²Π΅ΡΡΡΡ 0.106.0, Π°Π»Π΅ Π· ΠΊΡΠ»ΡΠΊΠΎΠΌΠ° ΠΏΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ° Π²ΠΈΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ Ρ ΠΊΡΠ°ΠΉΠΎΠ²ΠΈΡ
Π²ΠΈΠΏΠ°Π΄ΠΊΠ°Ρ
.
Π£ **FastAPI** 0.106.0 ΡΠ΅ Π·ΠΌΡΠ½Π΅Π½ΠΎ, ΡΠΎΠ± Π½Π΅ ΡΡΡΠΈΠΌΡΠ²Π°ΡΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΏΡΠ΄ ΡΠ°Ρ ΠΎΡΡΠΊΡΠ²Π°Π½Π½Ρ, ΠΏΠΎΠΊΠΈ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ ΠΏΡΠ΄Π΅ ΠΌΠ΅ΡΠ΅ΠΆΠ΅Ρ.
-/// tip | ΠΠΎΡΠ°Π΄Π°
+/// tip
ΠΡΡΠΌ ΡΠΎΠ³ΠΎ, ΡΠΎΠ½ΠΎΠ²Π° Π·Π°Π΄Π°ΡΠ° Π·Π°Π·Π²ΠΈΡΠ°ΠΉ Ρ Π½Π΅Π·Π°Π»Π΅ΠΆΠ½ΠΈΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ Π»ΠΎΠ³ΡΠΊΠΈ, ΡΠΊΠΈΠΉ ΡΠ»ΡΠ΄ ΠΎΠ±ΡΠΎΠ±Π»ΡΡΠΈ ΠΎΠΊΡΠ΅ΠΌΠΎ, Π· Π²Π»Π°ΡΠ½ΠΈΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Π²Π»Π°ΡΠ½ΠΈΠΌ Π·'ΡΠ΄Π½Π°Π½Π½ΡΠΌ Π· Π±Π°Π·ΠΎΡ Π΄Π°Π½ΠΈΡ
).
{* ../../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.
6. Π’ΡΡ ΠΌΠΈ ΠΏΠΎΠ²Π΅ΡΡΠ°ΡΠΌΠΎ ΡΠ»ΠΎΠ²Π½ΠΈΠΊ, ΡΠΎ ΠΌΡΡΡΠΈΡΡ `items`, ΡΠΊΠΈΠΉ Ρ ΡΠΏΠΈΡΠΊΠΎΠΌ dataclass.
- FastAPI ΡΡΠ΅ ΡΠ΅ Π·Π΄Π°ΡΠ½ΠΈΠΉ <dfn title="ΠΏΠ΅ΡΠ΅ΡΠ²ΠΎΡΠ΅Π½Π½Ρ Π΄Π°Π½ΠΈΡ
Ρ ΡΠΎΡΠΌΠ°Ρ, ΡΠΊΠΈΠΉ ΠΌΠΎΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ">ΡΠ΅ΡΡΠ°Π»ΡΠ·ΡΠ²Π°ΡΠΈ</dfΠ½> Π΄Π°Π½Ρ Π΄ΠΎ JSON.
+ FastAPI ΡΡΠ΅ ΡΠ΅ Π·Π΄Π°ΡΠ½ΠΈΠΉ <dfn title="ΠΏΠ΅ΡΠ΅ΡΠ²ΠΎΡΠ΅Π½Π½Ρ Π΄Π°Π½ΠΈΡ
Ρ ΡΠΎΡΠΌΠ°Ρ, ΡΠΊΠΈΠΉ ΠΌΠΎΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ">ΡΠ΅ΡΡΠ°Π»ΡΠ·ΡΠ²Π°ΡΠΈ</dfn> Π΄Π°Π½Ρ Π΄ΠΎ JSON.
7. Π’ΡΡ Ρ `response_model` Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½ΠΎ Π°Π½ΠΎΡΠ°ΡΡΡ ΡΠΈΠΏΡ ΡΠΏΠΈΡΠΎΠΊ dataclass `Author`.
Π’ΡΡ ΡΡΠ½ΠΊΡΡΡ-ΠΎΠ±ΡΠΎΠ±Π½ΠΈΠΊ ΠΏΠΎΠ΄ΡΡ `shutdown` Π·Π°ΠΏΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΠΉ ΡΡΠ΄ΠΎΠΊ `"Application shutdown"` Ρ ΡΠ°ΠΉΠ» `log.txt`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π£ ΡΡΠ½ΠΊΡΡΡ `open()` ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `mode="a"` ΠΎΠ·Π½Π°ΡΠ°Ρ Β«appendΒ», ΡΠΎΠΆ ΡΡΠ΄ΠΎΠΊ Π±ΡΠ΄Π΅ Π΄ΠΎΠ΄Π°Π½ΠΎ ΠΏΡΡΠ»Ρ Π²ΡΡΠΎΠ³ΠΎ, ΡΠΎ Ρ Ρ ΡΠ°ΠΉΠ»Ρ, Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄Π½ΡΠΎΠ³ΠΎ Π²ΠΌΡΡΡΡ.
ΠΡΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ, Ρ ΡΠ΅Ρ
Π½ΡΡΠ½ΡΠΉ ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ ASGI, ΡΠ΅ ΡΠ°ΡΡΠΈΠ½Π° [ΠΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΡΡΠΈΠ²Π°Π»ΠΎΡΡΡ ΠΆΠΈΡΡΡ](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), Ρ ΡΠ°ΠΌ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Ρ ΠΏΠΎΠ΄ΡΡ `startup` Ρ `shutdown`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΠΈ Π±ΡΠ»ΡΡΠ΅ ΠΏΡΠΎ ΠΎΠ±ΡΠΎΠ±Π½ΠΈΠΊΠΈ `lifespan` Ρ [Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ 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)
ΠΠ΅ΡΠΊΡ Π· ΡΠΈΡ
ΡΡΡΠ΅Π½Ρ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΡΡΡ Π±ΡΡΠΈ Π· Π²ΡΠ΄ΠΊΡΠΈΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π°Π±ΠΎ ΠΌΠ°ΡΠΈ Π±Π΅Π·ΠΊΠΎΡΡΠΎΠ²Π½Ρ ΡΠ°ΡΠΈΡΠΈ, ΡΠΎΠΆ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΡΠΎΠ±ΡΠ²Π°ΡΠΈ ΡΡ
Π±Π΅Π· ΡΡΠ½Π°Π½ΡΠΎΠ²ΠΈΡ
Π·ΠΎΠ±ΠΎΠ²'ΡΠ·Π°Π½Ρ. ΠΠ½ΡΡ ΠΊΠΎΠΌΠ΅ΡΡΡΠΉΠ½Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΈ SDK ΡΠ°ΠΊΠΎΠΆ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΉ ΡΡ
ΠΌΠΎΠΆΠ½Π° Π·Π½Π°ΠΉΡΠΈ ΠΎΠ½Π»Π°ΠΉΠ½. π€
ΠΠ° ΡΡΠΎΠΌΡ Π΅ΡΠ°ΠΏΡ Π²ΠΈ ΠΌΠ°ΡΡΠ΅ ΠΏΠΎΡΡΡΠ±Π½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ Π·Π²ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΡ (ΡΡ, ΡΠΊΡ ΠΌΠ°Ρ ΡΠ΅Π°Π»ΡΠ·ΡΠ²Π°ΡΠΈ *Π·ΠΎΠ²Π½ΡΡΠ½ΡΠΉ ΡΠΎΠ·ΡΠΎΠ±Π½ΠΈΠΊ* Ρ *Π·ΠΎΠ²Π½ΡΡΠ½ΡΠΎΠΌΡ 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`) Ρ `callbacks=`, Π° ΠΉΠΎΠ³ΠΎ `.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`.
-Γ\97Γ\80ΓΒΎΓΒ±Γ\96Γ\82Γ\8c Γ\86ΓΒ΅ ΓΒΏΓ\96Γ\81ΓΒ»Γ\8f ΓΒ΄ΓΒΎΓΒ΄ΓΒ°ΓΒ²ΓΒ°ΓΒ½ΓΒ½Γ\8f ΓΒ²Γ\81Γ\96Γ\85 *ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86Γ\96ΓΒΉ Γ\88ΓΒ»Γ\8fΓ\85Γ\83*.
+ΓΒ€Γ\83ΓΒ½ΓΒΊΓ\86Γ\96Γ\8f ΓΒΎΓ\82Γ\80ΓΒΈΓΒΌΓ\83Γ\94 ΓΒΊΓΒΎΓΒΆΓΒ΅ΓΒ½ `APIRoute` Γ\96 ΓΒΏΓΒΎΓΒ²ΓΒ΅Γ\80Γ\82ΓΒ°Γ\94 `operationId`, Γ\8fΓΒΊΓΒΈΓΒΉ Γ\81ΓΒ»Γ\96ΓΒ΄ ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒΎΓΒ²Γ\83ΓΒ²ΓΒ°Γ\82ΓΒΈ ΓΒ΄ΓΒ»Γ\8f Γ\86Γ\96Γ\94Γ\97 ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86Γ\96Γ\97 Γ\88ΓΒ»Γ\8fΓ\85Γ\83.
-{* ../../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` Π²ΠΆΠ΅ Π² ΠΏΠ°ΠΌ'ΡΡΡ, ΡΠΎΠΆ ΡΠΈΡΠ°Π½Π½Ρ Π½ΡΡΠΎΠ³ΠΎ Π½Π΅ Π±Π»ΠΎΠΊΡΡ.
ΠΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·ΠΌΡΡΡΠ²Π°ΡΠΈ AI-Π°Π³Π΅Π½ΡΠ° Π²ΠΈΠΊΠΎΠ½ΡΠ²Π°ΡΠΈ Π΄ΡΡ Π²ΡΠ΄ Π²Π°ΡΠΎΠ³ΠΎ ΡΠΌΠ΅Π½Ρ.
-ΠΡΠΊΡΠ»ΡΠΊΠΈ Π²ΡΠ½ ΠΏΡΠ°ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, Π° Π½Π΅ Ρ Π²ΡΠ΄ΠΊΡΠΈΡΠΎΠΌΡ ΡΠ½ΡΠ΅ΡΠ½Π΅ΡΡ, Π²ΠΈ Π²ΠΈΡΡΡΡΡΡΠ΅ Π½Π΅ Π½Π°Π»Π°ΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΠΆΠΎΠ΄Π½ΠΎΡ Π°Π²ΡΠ΅Π½ΡΠΈΡΡΠΊΠ°ΡΡΡ, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΊΠ»Π°Π΄Π°ΡΡΠΈΡΡ Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡ ΠΌΠ΅ΡΠ΅ΠΆΡ.
+ΠΡΠΊΡΠ»ΡΠΊΠΈ Π²ΡΠ½ ΠΏΡΠ°ΡΡΡ **Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ**, Π° Π½Π΅ Ρ Π²ΡΠ΄ΠΊΡΠΈΡΠΎΠΌΡ ΡΠ½ΡΠ΅ΡΠ½Π΅ΡΡ, Π²ΠΈ Π²ΠΈΡΡΡΡΡΡΠ΅ **Π½Π΅ Π½Π°Π»Π°ΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΠΆΠΎΠ΄Π½ΠΎΡ Π°Π²ΡΠ΅Π½ΡΠΈΡΡΠΊΠ°ΡΡΡ**, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΊΠ»Π°Π΄Π°ΡΡΠΈΡΡ Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡ ΠΌΠ΅ΡΠ΅ΠΆΡ.
ΠΠ΄ΠΈΠ½ ΡΠ· Π²Π°ΡΠΈΡ
ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠ² ΠΌΠΎΠΆΠ΅ Π²ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ ΠΉΠΎΠ³ΠΎ Ρ Π·Π°ΠΏΡΡΡΠΈΡΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ.
Π ΡΠΈΠΌ Π½Π°Π»Π°ΡΡΡΠ²Π°Π½Π½ΡΠΌ Π·Π°ΠΏΠΈΡΠΈ Π±Π΅Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° `Content-Type` ΠΌΠ°ΡΠΈΠΌΡΡΡ ΡΡΠ»ΠΎ, ΡΠΎΠ·ΡΠ±ΡΠ°Π½Π΅ ΡΠΊ JSON, ΡΠΎ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π°Ρ ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΡΡ ΡΡΠ°ΡΡΡΠΈΡ
Π²Π΅ΡΡΡΠΉ FastAPI.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π¦Ρ ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΠΊΡ Ρ ΠΊΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ Π΄ΠΎΠ΄Π°Π½ΠΎ Ρ FastAPI 0.132.0.
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note
ΠΡΠΊΡΠ»ΡΠΊΠΈ ΡΠ΅ WebSocket, Π½Π΅ ΠΌΠ°Ρ ΡΠ΅Π½ΡΡ ΠΏΡΠ΄Π½ΡΠΌΠ°ΡΠΈ `HTTPException`, Π½Π°ΡΠΎΠΌΡΡΡΡ ΠΌΠΈ ΠΏΡΠ΄Π½ΡΠΌΠ°ΡΠΌΠΎ `WebSocketException`.
## ΠΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π²ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ `a2wsgi`, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ `pip install a2wsgi`.
</div>
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΡΠ½ΡΡΡΡ ΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΈ ΡΠ° ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π΄Π»Ρ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Π½Ρ Ρ Π²ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΠ°ΠΊΠ΅ΡΡΠ².
Docker ΡΠ° ΡΠ½ΡΡ ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π±ΠΈΡΠ°ΡΡΡ ΡΡ ΠΎΠ±ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΠ² ΡΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ, Π΄ΠΎΠ΄Π°ΡΡΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠ°Ρ ΠΏΠΎΠ²Π΅ΡΡ
ΡΠ½ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· Π²Π΅ΡΡ
Π½ΡΠΎΡ ΡΠ°ΡΡΠΈΠ½ΠΈ `Dockerfile` Ρ Π΄ΠΎΠ΄Π°ΡΡΠΈ Π±ΡΠ΄Ρ-ΡΠΊΡ ΡΠ°ΠΉΠ»ΠΈ, ΡΡΠ²ΠΎΡΠ΅Π½Ρ ΠΊΠΎΠΆΠ½ΠΎΡ ΡΠ½ΡΡΡΡΠΊΡΡΡΡ Π² `Dockerfile`.
-Docker ΡΠ° ΠΏΠΎΠ΄ΡΠ±Π½Ρ ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΡΠ°ΠΊΠΎΠΆ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡ Π²Π½ΡΡΡΡΡΠ½ΡΠΉ ΠΊΠ΅Ρ ΠΏΡΠ΄ ΡΠ°Ρ Π·Π±ΡΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Ρ. Π―ΠΊΡΠΎ ΡΠ°ΠΉΠ» Π½Π΅ Π·ΠΌΡΠ½ΡΠ²Π°Π²ΡΡ Π· ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΎΡΡΠ°Π½Π½ΡΠΎΡ Π·Π±ΡΡΠΊΠΈ, ΡΠΎΠ΄Ρ Π²ΡΠ½ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΠΎΠΉ ΡΠ°ΠΌΠΈΠΉ ΡΠ°Ρ, ΡΡΠ²ΠΎΡΠ΅Π½ΠΈΠΉ Π²ΠΎΡΡΠ°Π½Π½Ρ, Π·Π°ΠΌΡΡΡΡ ΠΊΠΎΠΏΡΡΠ²Π°Π½Π½Ρ ΡΠ°ΠΉΠ»Ρ Π·Π½ΠΎΠ²Ρ ΡΠ° ΡΡΠ²ΠΎΡΠ΅Π½Π½Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΡΡ Π· Π½ΡΠ»Ρ.
+Docker ΡΠ° ΠΏΠΎΠ΄ΡΠ±Π½Ρ ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΡΠ°ΠΊΠΎΠΆ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡ Π²Π½ΡΡΡΡΡΠ½ΡΠΉ ΠΊΠ΅Ρ ΠΏΡΠ΄ ΡΠ°Ρ Π·Π±ΡΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Ρ. Π―ΠΊΡΠΎ ΡΠ°ΠΉΠ» Π½Π΅ Π·ΠΌΡΠ½ΡΠ²Π°Π²ΡΡ Π· ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΎΡΡΠ°Π½Π½ΡΠΎΡ Π·Π±ΡΡΠΊΠΈ, ΡΠΎΠ΄Ρ Π²ΡΠ½ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΠΎΠΉ ΡΠ°ΠΌΠΈΠΉ ΡΠ°Ρ, ΡΡΠ²ΠΎΡΠ΅Π½ΠΈΠΉ Π²ΠΎΡΡΠ°Π½Ρ, Π·Π°ΠΌΡΡΡΡ ΠΊΠΎΠΏΡΡΠ²Π°Π½Π½Ρ ΡΠ°ΠΉΠ»Ρ Π·Π½ΠΎΠ²Ρ ΡΠ° ΡΡΠ²ΠΎΡΠ΅Π½Π½Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΡΡ Π· Π½ΡΠ»Ρ.
ΠΡΠΎΡΡΠ΅ ΡΠ½ΠΈΠΊΠ½Π΅Π½Π½Ρ ΠΊΠΎΠΏΡΡΠ²Π°Π½Π½Ρ ΡΠ°ΠΉΠ»ΡΠ² Π½Π΅ ΠΎΠ±ΠΎΠ²βΡΠ·ΠΊΠΎΠ²ΠΎ ΡΡΡΡΡΠ²ΠΎ ΠΏΠΎΠΊΡΠ°ΡΡΡ ΡΠΈΡΡΠ°ΡΡΡ, Π°Π»Π΅ ΠΎΡΠΊΡΠ»ΡΠΊΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΊΡΠΎΠΊΡ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½ΠΎ ΠΊΠ΅Ρ, Π²ΡΠ½ ΠΌΠΎΠΆΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΠΊΠ΅Ρ Ρ Π΄Π»Ρ Π½Π°ΡΡΡΠΏΠ½ΠΎΠ³ΠΎ ΠΊΡΠΎΠΊΡ. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, Π²ΡΠ½ ΠΌΠΎΠΆΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΠΊΠ΅Ρ Π΄Π»Ρ ΡΠ½ΡΡΡΡΠΊΡΡΡ, ΡΠΊΠ° Π²ΡΡΠ°Π½ΠΎΠ²Π»ΡΡ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ:
ΠΠ°ΡΠ²Π½ΡΡΡΡ ΡΠ½ΡΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ² Π²ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° (ΡΠΊ ΡΠ΅ Π±ΡΠ»ΠΎ Π± ΡΠ· ΠΊΡΠ»ΡΠΊΠΎΠΌΠ° ΠΏΡΠ°ΡΡΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ) Π»ΠΈΡΠ΅ Π΄ΠΎΠ΄Π°ΡΡΡ Π·Π°ΠΉΠ²ΠΎΡ ΡΠΊΠ»Π°Π΄Π½ΠΎΡΡΡ, ΡΠΊΡ, Π½Π°ΠΉΡΠΌΠΎΠ²ΡΡΠ½ΡΡΠ΅, Π²ΠΈ Π²ΠΆΠ΅ Π²ΠΈΡΡΡΡΡΡΠ΅ Π½Π° ΡΡΠ²Π½Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
-### Γ\9aΓΒΎΓΒ½Γ\82ΓΒ΅ΓΒΉΓΒ½ΓΒ΅Γ\80ΓΒΈ ΓΒ· ΓΒΊΓ\96ΓΒ»Γ\8cΓΒΊΓΒΎΓΒΌΓΒ° ΠΏΡΠΎΡΠ΅ΡΠ°ΠΌΠΈ ΡΠ° ΠΎΡΠΎΠ±Π»ΠΈΠ²Ρ Π²ΠΈΠΏΠ°Π΄ΠΊΠΈ { #containers-with-multiple-processes-and-special-cases }
+### Γ\9aΓΒΎΓΒ½Γ\82ΓΒ΅ΓΒΉΓΒ½ΓΒ΅Γ\80ΓΒΈ ΓΒ· ΓΒΊΓ\96ΓΒ»Γ\8cΓΒΊΓΒΎΓΒΌΓΒΈ ΠΏΡΠΎΡΠ΅ΡΠ°ΠΌΠΈ ΡΠ° ΠΎΡΠΎΠ±Π»ΠΈΠ²Ρ Π²ΠΈΠΏΠ°Π΄ΠΊΠΈ { #containers-with-multiple-processes-and-special-cases }
ΠΠ²ΡΡΠ½ΠΎ, Ρ ΠΎΡΠΎΠ±Π»ΠΈΠ²Ρ Π²ΠΈΠΏΠ°Π΄ΠΊΠΈ, ΠΊΠΎΠ»ΠΈ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Ρ
ΠΎΡΡΡΠΈ ΠΌΠ°ΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ· ΠΊΡΠ»ΡΠΊΠΎΠΌΠ° ΠΏΡΠΎΡΠ΅ΡΠ°ΠΌΠΈ-ΠΏΡΠ°ΡΡΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ Uvicorn Π²ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ.
Π―ΠΊΡΠΎ Ρ Π²Π°Ρ ΠΊΡΠ»ΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΠ², ΡΠΌΠΎΠ²ΡΡΠ½ΠΎ ΠΊΠΎΠΆΠ΅Π½ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅Ρ (Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΡ 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 }
* [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): Rust HTTP-ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ Python-Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡΠ².
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit - Π»Π΅Π³ΠΊΠ΅ ΠΉ ΡΠ½ΡΠ²Π΅ΡΡΠ°Π»ΡΠ½Π΅ ΡΠ΅ΡΠ΅Π΄ΠΎΠ²ΠΈΡΠ΅ Π²ΠΈΠΊΠΎΠ½Π°Π½Π½Ρ Π²Π΅Π±Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡΠ².
## Π‘Π΅ΡΠ²Π΅ΡΠ½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° { #server-machine-and-server-program }
Π Π½Π΅Π²Π΅Π»ΠΈΠΊΠ° Π΄Π΅ΡΠ°Π»Ρ ΡΠΎΠ΄ΠΎ Π½Π°Π·Π², ΡΠΊΡ Π²Π°ΡΡΠΎ ΠΏΠ°ΠΌ'ΡΡΠ°ΡΠΈ. π‘
-Π‘Π»ΠΎΠ²ΠΎ Β«**ΡΠ΅ΡΠ²Π΅Ρ**Β» Π·Π°Π·Π²ΠΈΡΠ°ΠΉ ΠΎΠ·Π½Π°ΡΠ°Ρ Ρ Π²ΡΠ΄Π΄Π°Π»Π΅Π½ΠΈΠΉ/Ρ
ΠΌΠ°ΡΠ½ΠΈΠΉ ΠΊΠΎΠΌΠΏ'ΡΡΠ΅Ρ (ΡΡΠ·ΠΈΡΠ½Π° Π°Π±ΠΎ Π²ΡΡΡΡΠ°Π»ΡΠ½Π° ΠΌΠ°ΡΠΈΠ½Π°), Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡ, ΡΠΎ ΠΏΡΠ°ΡΡΡ Π½Π° ΡΡΠΉ ΠΌΠ°ΡΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Uvicorn).
+Π‘Π»ΠΎΠ²ΠΎ Β«ΡΠ΅ΡΠ²Π΅ΡΒ» Π·Π°Π·Π²ΠΈΡΠ°ΠΉ ΠΎΠ·Π½Π°ΡΠ°Ρ Ρ Π²ΡΠ΄Π΄Π°Π»Π΅Π½ΠΈΠΉ/Ρ
ΠΌΠ°ΡΠ½ΠΈΠΉ ΠΊΠΎΠΌΠΏ'ΡΡΠ΅Ρ (ΡΡΠ·ΠΈΡΠ½Π° Π°Π±ΠΎ Π²ΡΡΡΡΠ°Π»ΡΠ½Π° ΠΌΠ°ΡΠΈΠ½Π°), Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡ, ΡΠΎ ΠΏΡΠ°ΡΡΡ Π½Π° ΡΡΠΉ ΠΌΠ°ΡΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Uvicorn).
ΠΠ°ΠΉΡΠ΅ Π½Π° ΡΠ²Π°Π·Ρ, ΡΠΎ ΠΊΠΎΠ»ΠΈ Π²ΠΈ Π±Π°ΡΠΈΡΠ΅ ΡΠ»ΠΎΠ²ΠΎ Β«ΡΠ΅ΡΠ²Π΅ΡΒ» Π·Π°Π³Π°Π»ΠΎΠΌ, Π²ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅ ΡΡΠΎΡΡΠ²Π°ΡΠΈΡΡ Π±ΡΠ΄Ρ-ΡΠΊΠΎΠ³ΠΎ Π· ΡΠΈΡ
Π΄Π²ΠΎΡ
Π·Π½Π°ΡΠ΅Π½Ρ.
Π’ΡΡ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΡΠΊ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ Uvicorn ΡΠ· ΠΏΡΠΎΡΠ΅ΡΠ°ΠΌΠΈ-ΠΏΡΠ°ΡΡΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ `fastapi` Π°Π±ΠΎ Π±Π΅Π·ΠΏΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ `uvicorn`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π―ΠΊΡΠΎ Π²ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄ Π· Docker Π°Π±ΠΎ Kubernetes, Ρ ΡΠΎΠ·ΠΏΠΎΠ²ΡΠΌ ΠΏΡΠΎ ΡΠ΅ Π±ΡΠ»ΡΡΠ΅ Π² Π½Π°ΡΡΡΠΏΠ½ΠΎΠΌΡ ΡΠΎΠ·Π΄ΡΠ»Ρ: [FastAPI Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°Ρ
- Docker](docker.md).
- `openapi_version`: ΠΠ΅ΡΡΡΡ ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ OpenAPI, ΡΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ. Π’ΠΈΠΏΠΎΠ²ΠΎ ΠΎΡΡΠ°Π½Π½Ρ: `3.1.0`.
- `summary`: ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΡΠ΄ΡΡΠΌΠΎΠΊ API.
- `description`: ΠΠΏΠΈΡ Π²Π°ΡΠΎΠ³ΠΎ API; ΠΌΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ markdown Ρ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠΉ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ.
-- `routes`: ΓΒ‘ΓΒΏΓΒΈΓ\81ΓΒΎΓΒΊ ΓΒΌΓΒ°Γ\80Γ\88Γ\80Γ\83Γ\82Γ\96ΓΒ², Γ\86ΓΒ΅ ΓΒΊΓΒΎΓΒΆΓΒ½ΓΒ° ΓΒ· ΓΒ·ΓΒ°Γ\80ΓΒ΅Γ\94Γ\81Γ\82Γ\80ΓΒΎΓΒ²ΓΒ°ΓΒ½ΓΒΈΓ\85 *ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86Γ\96ΓΒΉ Γ\88ΓΒ»Γ\8fΓ\85Γ\83*. Γ\87Γ\85 ΓΒ±ΓΒ΅Γ\80Γ\83Γ\82Γ\8c ΓΒ· `app.routes`.
+- `routes`: Γ\9cΓΒ°Γ\80Γ\88Γ\80Γ\83Γ\82ΓΒΈ Γ\96ΓΒ· ΓΒ·ΓΒ°Γ\81Γ\82ΓΒΎΓ\81Γ\83ΓΒ½ΓΒΊΓ\83, ΓΒ²ΓΒ·Γ\8fΓ\82Γ\96 ΓΒ· `app.routes`. FastAPI ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒΎΓΒ²Γ\83Γ\94 Γ\97Γ\85 ΓΒ΄ΓΒ»Γ\8f ΓΒ·ΓΒ±ΓΒΈΓ\80ΓΒ°ΓΒ½ΓΒ½Γ\8f ΓΒ·ΓΒ°Γ\80ΓΒ΅Γ\94Γ\81Γ\82Γ\80ΓΒΎΓΒ²ΓΒ°ΓΒ½ΓΒΈΓ\85 *ΓΒΎΓΒΏΓΒ΅Γ\80ΓΒ°Γ\86Γ\96ΓΒΉ Γ\88ΓΒ»Γ\8fΓ\85Γ\83*, ΓΒ²ΓΒΊΓΒ»Γ\8eΓ\87ΓΒ½ΓΒΎ ΓΒ· Γ\82ΓΒΈΓΒΌΓΒΈ, Γ\89ΓΒΎ ΓΒ· ΓΒΏΓ\96ΓΒ΄ΓΒΊΓΒ»Γ\8eΓ\87ΓΒ΅ΓΒ½ΓΒΈΓ\85 Γ\80ΓΒΎΓ\83Γ\82ΓΒ΅Γ\80Γ\96ΓΒ².
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// tip | Π’Π΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ
+
+`app.routes` - ΡΠ΅ Π½ΠΈΠΆΡΠΎΡΡΠ²Π½Π΅Π²Π΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠ°ΡΡΡΡΡΡΠ². ΠΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ ΠΌΠ°ΡΡΡΡΡΡΠ², ΡΠΊΡ FastAPI Π²Π½ΡΡΡΡΡΠ½ΡΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡ Π΄Π»Ρ ΠΏΡΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΡΠΎΡΡΠ΅ΡΡΠ², Π° Π½Π΅ Π»ΠΈΡΠ΅ ΠΊΡΠ½ΡΠ΅Π²Ρ ΠΎΠ±'ΡΠΊΡΠΈ `APIRoute`.
+
+ΠΠΈ Π²ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ `app.routes` Π΄ΠΎ `get_openapi()`. FastAPI ΠΎΠ±ΡΠΉΠ΄Π΅ ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠ°ΡΡΡΡΡΡΠ², ΡΠΎΠ± Π·ΡΠ±ΡΠ°ΡΠΈ ΡΠ°ΠΊΡΠΈΡΠ½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ.
+
+///
+
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `summary` Π΄ΠΎΡΡΡΠΏΠ½ΠΈΠΉ Π² OpenAPI 3.1.0 Ρ Π²ΠΈΡΠ΅, ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ FastAPI 0.99.0 Ρ Π²ΠΈΡΠ΅.
# ΠΠΊΡΠ΅ΠΌΡ ΡΡ
Π΅ΠΌΠΈ OpenAPI Π΄Π»Ρ Π²Π²Π΅Π΄Π΅Π½Π½Ρ ΡΠ° Π²ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ, ΡΠΈ Π½Ρ { #separate-openapi-schemas-for-input-and-output-or-not }
-ΠΡΠ΄ΠΊΠΎΠ»ΠΈ Π²ΠΈΠΉΡΠΎΠ² **Pydantic v2**, Π·Π³Π΅Π½Π΅ΡΠΎΠ²Π°Π½ΠΈΠΉ OpenAPI ΡΡΠ°Π² ΡΡΠΎΡ
ΠΈ ΡΠΎΡΠ½ΡΡΠΈΠΌ Ρ Π±ΡΠ»ΡΡ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈΠΌ, Π½ΡΠΆ ΡΠ°Π½ΡΡΠ΅. π
+ΠΡΠ΄ΠΊΠΎΠ»ΠΈ Π²ΠΈΠΉΡΠΎΠ² **Pydantic v2**, Π·Π³Π΅Π½Π΅ΡΠΎΠ²Π°Π½ΠΈΠΉ OpenAPI ΡΡΠ°Π² ΡΡΠΎΡ
ΠΈ ΡΠΎΡΠ½ΡΡΠΈΠΌ Ρ Π±ΡΠ»ΡΡ **ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈΠΌ**, Π½ΡΠΆ ΡΠ°Π½ΡΡΠ΅. π
ΠΠ°ΡΠΏΡΠ°Π²Π΄Ρ ΠΏΠΎΠ΄Π΅ΠΊΡΠ΄ΠΈ Π±ΡΠ΄Π΅ Π½Π°Π²ΡΡΡ **Π΄Π²Ρ ΡΡ
Π΅ΠΌΠΈ JSON** Π² OpenAPI Π΄Π»Ρ ΡΡΡΡ ΡΠ°ΠΌΠΎΡ ΠΌΠΎΠ΄Π΅Π»Ρ Pydantic: Π΄Π»Ρ Π²Π²Π΅Π΄Π΅Π½Π½Ρ ΡΠ° Π΄Π»Ρ Π²ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ - Π·Π°Π»Π΅ΠΆΠ½ΠΎ Π²ΡΠ΄ Π½Π°ΡΠ²Π½ΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½Ρ Π·Π° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ.
Π£ ΡΠ°ΠΊΠΎΠΌΡ ΡΠ°Π·Ρ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΌΠΊΠ½ΡΡΠΈ ΡΡ ΠΌΠΎΠΆΠ»ΠΈΠ²ΡΡΡΡ Ρ **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 Ρ ΡΠΎΠ·Π³ΠΎΡΠ½Π΅ ΠΉΠΎΠ³ΠΎ Π² Ρ
ΠΌΠ°ΡΡ. Π―ΠΊΡΠΎ Π²ΠΈ Π½Π΅ Π²Π²ΡΠΉΡΠ»ΠΈ Π² ΠΎΠ±Π»ΡΠΊΠΎΠ²ΠΈΠΉ Π·Π°ΠΏΠΈΡ, Π²Π°Ρ Π±ΡΠ°ΡΠ·Π΅Ρ Π²ΡΠ΄ΠΊΡΠΈΡΡΡΡΡ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π°Π²ΡΠ΅Π½ΡΠΈΡΡΠΊΠ°ΡΡΡ.
+
ΠΡΡ Ρ Π²ΡΠ΅! Π’Π΅ΠΏΠ΅Ρ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΡΠΈΠΌΠ°ΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²Π°ΡΠΎΠ³ΠΎ Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡ Π·Π° ΡΡΡΡ URL-Π°Π΄ΡΠ΅ΡΠΎΡ. β¨
#### ΠΡΠΎ FastAPI Cloud { #about-fastapi-cloud }
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
-/// note | Γ\9fΓ\80ΓΒΈΓΒΌΓ\96Γ\82ΓΒΊΓΒ°
+/// note | ΓΒ’ΓΒ΅Γ\85ΓΒ½Γ\96Γ\87ΓΒ½Γ\96 ΓΒ΄ΓΒ΅Γ\82ΓΒ°ΓΒ»Γ\96
-`users.router` ΠΌΡΡΡΠΈΡΡ `APIRouter` Ρ ΡΠ°ΠΉΠ»Ρ `app/routers/users.py`.
+FastAPI Π·Π±Π΅ΡΡΠ³Π°Ρ ΠΎΡΠΈΠ³ΡΠ½Π°Π»ΡΠ½ΠΈΠΉ `APIRouter` Ρ ΠΉΠΎΠ³ΠΎ `APIRoute` Π°ΠΊΡΠΈΠ²Π½ΠΈΠΌΠΈ ΠΏΡΡΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ router'Π° Π΄ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡ.
-Γ\90 `items.router` ΓΒΌΓ\96Γ\81Γ\82ΓΒΈΓ\82Γ\8c `APIRouter` Γ\83 Γ\84ΓΒ°ΓΒΉΓΒ»Γ\96 `app/routers/items.py`.
+ΓΒ¦ΓΒ΅ ΓΒΎΓΒ·ΓΒ½ΓΒ°Γ\87ΓΒ°Γ\94, Γ\89ΓΒΎ ΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82Γ\83ΓΒ²ΓΒ°Γ\86Γ\8cΓΒΊΓ\96 ΓΒΏΓ\96ΓΒ΄ΓΒΊΓΒ»ΓΒ°Γ\81ΓΒΈ `APIRouter` Γ\96 `APIRoute` Γ\96 ΓΒ½ΓΒ°ΓΒ΄ΓΒ°ΓΒ»Γ\96 ΓΒ±Γ\80ΓΒ°Γ\82ΓΒΈΓΒΌΓ\83Γ\82Γ\8c Γ\83Γ\87ΓΒ°Γ\81Γ\82Γ\8c ΓΒΏΓ\96Γ\81ΓΒ»Γ\8f ΓΒ²ΓΒΊΓΒ»Γ\8eΓ\87ΓΒ΅ΓΒ½ΓΒ½Γ\8f router'ΓΒ°.
///
Π¦Π΅ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ ΠΌΠ°ΡΡΡΡΡΠΈ Π· ΡΡΠΎΠ³ΠΎ router'Π° ΡΠΊ ΡΠ°ΡΡΠΈΠ½Ρ Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡ.
-/// note | Π’Π΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ
-
-Π€Π°ΠΊΡΠΈΡΠ½ΠΎ, Π²ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ Π΄Π»Ρ ΠΊΠΎΠΆΠ½ΠΎΡ *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ*, ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½ΠΎΡ Π² `APIRouter`, Π±ΡΠ΄Π΅ ΡΡΠ²ΠΎΡΠ΅Π½Π° ΠΎΠΊΡΠ΅ΠΌΠ° *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ*.
-
-Π’ΠΎΠ±ΡΠΎ Π·Π° Π»Π°ΡΡΡΠ½ΠΊΠ°ΠΌΠΈ Π²ΡΠ΅ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈΠΌΠ΅ ΡΠ°ΠΊ, Π½ΡΠ±ΠΈ ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Ρ ΡΠΎΠΉ ΡΠ°ΠΌΠΈΠΉ Π·Π°ΡΡΠΎΡΡΠ½ΠΎΠΊ.
-
-///
-
/// tip | ΠΠΎΡΠ°Π΄Π°
ΠΠ°ΠΌ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠΌΠ°ΡΠΈΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΡΡΡΡ ΠΏΡΠ΄ ΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ router'ΡΠ².
-Π¦Π΅ Π·Π°ΠΉΠΌΠ΅ ΠΌΡΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄ΠΈ Ρ Π²ΡΠ΄Π±ΡΠ²Π°ΡΠΈΠΌΠ΅ΡΡΡΡ Π»ΠΈΡΠ΅ ΠΏΡΠ΄ ΡΠ°Ρ Π·Π°ΠΏΡΡΠΊΡ.
+Π¦Π΅ ΡΠΏΡΠΎΡΠΊΡΠΎΠ²Π°Π½ΠΎ ΡΠΊ Π»Π΅Π³ΠΊΠΎΠ²Π°Π³ΠΎΠ²Π΅ ΡΡΡΠ΅Π½Π½Ρ Ρ Π½Π΅ Π΄ΠΎΠ΄Π°Ρ Π½Π°ΠΊΠ»Π°Π΄Π½ΠΈΡ
Π²ΠΈΡΡΠ°Ρ Π΄ΠΎ ΠΊΠΎΠΆΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΈΡΡ.
Π’ΠΎΠΆ ΡΠ΅ Π½Π΅ Π²ΠΏΠ»ΠΈΠ½Π΅ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΡΡΡΡ. β‘
Π¦Π΅ ΡΠΎΠΌΡ, ΡΠΎ ΠΌΠΈ Ρ
ΠΎΡΠ΅ΠΌΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΠΈ ΡΡ
Π½Ρ *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ* Π² ΡΡ
Π΅ΠΌΡ OpenAPI ΡΠ° ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ°.
-ΠΡΠΊΡΠ»ΡΠΊΠΈ ΠΌΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ·ΠΎΠ»ΡΠ²Π°ΡΠΈ ΡΡ
Ρ Β«Π·ΠΌΠΎΠ½ΡΡΠ²Π°ΡΠΈΒ» Π½Π΅Π·Π°Π»Π΅ΠΆΠ½ΠΎ Π²ΡΠ΄ ΡΠ΅ΡΡΠΈ, *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ* Β«ΠΊΠ»ΠΎΠ½ΡΡΡΡΡΡΒ» (ΡΡΠ²ΠΎΡΡΡΡΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ), Π° Π½Π΅ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡΡ Π±Π΅Π·ΠΏΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠΎ.
+FastAPI Π·Π±Π΅ΡΡΠ³Π°Ρ ΠΎΡΠΈΠ³ΡΠ½Π°Π»ΡΠ½Ρ router'ΠΈ ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ Π°ΠΊΡΠΈΠ²Π½ΠΈΠΌΠΈ ΠΉ ΠΏΠΎΡΠ΄Π½ΡΡ ΠΏΡΠ΅ΡΡΠΊΡΠΈ router'ΡΠ², Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ, ΠΌΡΡΠΊΠΈ, Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ ΡΠ° ΡΠ½ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Ρ ΠΏΡΠ΄ ΡΠ°Ρ ΠΎΠ±ΡΠΎΠ±ΠΊΠΈ Π·Π°ΠΏΠΈΡΡΠ² Ρ Π³Π΅Π½Π΅ΡΠ°ΡΡΡ OpenAPI.
///
router.include_router(other_router)
```
-ΠΠ΅ΡΠ΅ΠΊΠΎΠ½Π°ΠΉΡΠ΅ΡΡ, ΡΠΎ Π²ΠΈ ΡΠΎΠ±ΠΈΡΠ΅ ΡΠ΅ Π΄ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ `router` Π² Π·Π°ΡΡΠΎΡΡΠ½ΠΎΠΊ `FastAPI`, ΡΠΎΠ± *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ* Π· `other_router` ΡΠ°ΠΊΠΎΠΆ Π±ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ.
+ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·ΡΠΎΠ±ΠΈΡΠΈ ΡΠ΅ Π΄ΠΎ Π°Π±ΠΎ ΠΏΡΡΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ `router` Ρ Π·Π°ΡΡΠΎΡΡΠ½ΠΎΠΊ `FastAPI`. FastAPI Π²ΡΠ΅ ΠΎΠ΄Π½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ* Π· `other_router` Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΡΡ ΡΠ° OpenAPI.
+
+Π’Π΅ ΡΠ°ΠΌΠ΅ ΡΡΠΎΡΡΡΡΡΡΡ *ΠΎΠΏΠ΅ΡΠ°ΡΡΠΉ ΡΠ»ΡΡ
Ρ*, Π΄ΠΎΠ΄Π°Π½ΠΈΡ
ΠΏΡΠ·Π½ΡΡΠ΅ Π΄ΠΎ router'ΡΠ². ΠΠΎΠ½ΠΈ ΡΠ°ΠΊΠΎΠΆ Π±ΡΠ΄ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΡ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄Π½Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ.
+
+/// warning | Π’Π΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ
+
+Π£Π½ΠΈΠΊΠ°ΠΉΡΠ΅ ΠΏΡΡΠΌΠΎΡ ΠΌΡΡΠ°ΡΡΡ `router.routes` ΠΏΡΡΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ router'Π°. FastAPI ΡΠΎΠ·Π³Π»ΡΠ΄Π°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½Ρ router'Π° ΡΠΊ Β«ΠΆΠΈΠ²Π΅Β», ΡΠΎΠΌΡ ΠΎΡΠΈΠ³ΡΠ½Π°Π»ΡΠ½ΠΈΠΉ router Ρ ΠΉΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈ Π·Π°Π»ΠΈΡΠ°ΡΡΡΡΡ ΡΠ°ΡΡΠΈΠ½ΠΎΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΡΡ ΡΠ° Π³Π΅Π½Π΅ΡΠ°ΡΡΡ OpenAPI.
+
+ΠΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠΉΡΠ΅ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ²Π°Π½Ρ API, ΡΠ°ΠΊΡ ΡΠΊ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΈ *ΠΎΠΏΠ΅ΡΠ°ΡΡΠΉ ΡΠ»ΡΡ
Ρ* Ρ `.include_router()`, ΡΠΎΠ± Π΄ΠΎΠ΄Π°Π²Π°ΡΠΈ ΠΌΠ°ΡΡΡΡΡΠΈ ΡΠ° router'ΠΈ.
+
+Π‘ΠΏΡΠΈΠΉΠΌΠ°ΠΉΡΠ΅ `router.routes` ΡΠΊ Π½ΠΈΠΆΡΠΎΡΡΠ²Π½Π΅Π²Π΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠ°ΡΡΡΡΡΡΠ², ΡΠΊΠ΅ ΠΌΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Π½Ρ ΠΌΠ°ΡΡΡΡΡΡΠ² Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ router'ΠΈ, Ρ ΡΠ½ΠΈΠΊΠ°ΠΉΡΠ΅ ΠΏΠΎΠΊΠ»Π°Π΄Π°ΡΠΈΡΡ Π½Π° Π½ΡΠΎΠ³ΠΎ ΡΠΊ Π½Π° ΠΏΠ»Π°ΡΠΊΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΡΠ½ΡΠ΅Π²ΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΠΉ ΡΠ»ΡΡ
Ρ*.
+
+///
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
`Body` ΡΠ°ΠΊΠΎΠΆ ΠΌΠ°Ρ Π²ΡΡ ΡΡ ΡΠ°ΠΌΡ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π²Π°Π»ΡΠ΄Π°ΡΡΡ ΡΠ° ΠΌΠ΅ΡΠ°Π΄Π°Π½ΠΈΡ
, ΡΠΎ ΠΉ `Query`, `Path` ΡΠ° ΡΠ½ΡΡ, ΡΠΊΡ Π²ΠΈ ΠΏΠΎΠ±Π°ΡΠΈΡΠ΅ ΠΏΡΠ·Π½ΡΡΠ΅.
ΠΠ»Π΅ ΡΠΊΡΠΎ Π²ΠΈ Ρ
ΠΎΡΠ΅ΡΠ΅, ΡΠΎΠ± Π²ΡΠ½ ΠΎΡΡΠΊΡΠ²Π°Π² JSON Π· ΠΊΠ»ΡΡΠ΅ΠΌ `item`, Π° Π²ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ Π½ΡΠΎΠ³ΠΎ - Π²ΠΌΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ, ΡΠΊ ΡΠ΅ Π²ΡΠ΄Π±ΡΠ²Π°ΡΡΡΡΡ, ΠΊΠΎΠ»ΠΈ Π²ΠΈ ΠΎΠ³ΠΎΠ»ΠΎΡΡΡΡΠ΅ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΠ»Π°, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `Body` - `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
ΡΠΊ Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ:
}
```
-/// 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** Π»Π΅Π³ΠΊΠΎ Π· Π½ΠΈΠΌΠΈ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈ.
Π―ΠΊΡΠΎ Π²ΠΈ Π·Π°ΠΉΠ΄Π΅ΡΠ΅ Π΄ΠΎ **ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ API** Π·Π° Π°Π΄ΡΠ΅ΡΠΎΡ `/docs`, Π²ΠΈ Π·ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ±Π°ΡΠΈΡΠΈ **Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ** Π΄Π»Ρ cookies Ρ Π²Π°ΡΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΡΡ
ΡΠ»ΡΡ
Ρ*.
-ΠΠ»Π΅ Π½Π°Π²ΡΡΡ ΡΠΊΡΠΎ Π²ΠΈ Π·Π°ΠΏΠΎΠ²Π½ΠΈΡΠ΅ Π΄Π°Π½Ρ ΠΉ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ "Execute", ΠΎΡΠΊΡΠ»ΡΠΊΠΈ ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ ΠΏΡΠ°ΡΡΡ Π· **JavaScript**, cookies Π½Π΅ Π±ΡΠ΄ΡΡΡ Π²ΡΠ΄ΠΏΡΠ°Π²Π»Π΅Π½Ρ, Ρ Π²ΠΈ ΠΏΠΎΠ±Π°ΡΠΈΡΠ΅ **ΠΏΠΎΠΌΠΈΠ»ΠΊΡ**, Π½ΡΠ±ΠΈ Π²ΠΈ Π½Π΅ Π²Π²Π΅Π»ΠΈ ΠΆΠΎΠ΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½Ρ.
+ΠΠ»Π΅ Π½Π°Π²ΡΡΡ ΡΠΊΡΠΎ Π²ΠΈ **Π·Π°ΠΏΠΎΠ²Π½ΠΈΡΠ΅ Π΄Π°Π½Ρ** ΠΉ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ "Execute", ΠΎΡΠΊΡΠ»ΡΠΊΠΈ ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ ΠΏΡΠ°ΡΡΡ Π· **JavaScript**, cookies Π½Π΅ Π±ΡΠ΄ΡΡΡ Π²ΡΠ΄ΠΏΡΠ°Π²Π»Π΅Π½Ρ, Ρ Π²ΠΈ ΠΏΠΎΠ±Π°ΡΠΈΡΠ΅ **ΠΏΠΎΠΌΠΈΠ»ΠΊΡ**, Π½ΡΠ±ΠΈ Π²ΠΈ Π½Π΅ Π²Π²Π΅Π»ΠΈ ΠΆΠΎΠ΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½Ρ.
///
## ΠΡΠ΄ΡΡΠΌΠΎΠΊ { #summary }
-ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ **Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ** Π΄Π»Ρ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π½Ρ <dfn title="ΠΡΠ·ΡΠΌΡΡΡ ΠΎΡΡΠ°Π½Π½Ρ ΠΏΠ΅ΡΠΈΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΠΌ, ΡΠΊ ΠΏΡΠ΄Π΅ΡΠ΅. πͺ">**cookies**</dfn> Ρ **FastAPI**. π
+ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ **Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ** Π΄Π»Ρ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π½Ρ <dfn title="ΠΡΠ·ΡΠΌΡΡΡ ΠΎΡΡΠ°Π½Π½Ρ ΠΏΠ΅ΡΠΈΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΠΌ, ΡΠΊ ΠΏΡΠ΄Π΅ΡΠ΅. πͺ">**ΠΊΡΠΊΡ**</dfn> Ρ **FastAPI**. π
///
-/// info
+/// note
ΠΠ»Ρ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Π½Ρ ΠΊΡΠΊΡ Π²ΠΈ ΠΌΠ°ΡΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ `Cookie`, ΡΠΎΠΌΡ ΡΠΎ Π² ΡΠ½ΡΠΎΠΌΡ Π²ΠΈΠΏΠ°Π΄ΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π±ΡΠ΄ΡΡΡ ΡΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΎΠ²Π°Π½Ρ ΡΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π°ΠΏΠΈΡΡ.
///
-/// info
+/// note
ΠΠ°ΠΉΡΠ΅ Π½Π° ΡΠ²Π°Π·Ρ, ΡΠΎ ΠΎΡΠΊΡΠ»ΡΠΊΠΈ **Π±ΡΠ°ΡΠ·Π΅ΡΠΈ ΠΎΠ±ΡΠΎΠ±Π»ΡΡΡΡ ΠΊΡΠΊΡ** ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΌ ΡΠΈΠ½ΠΎΠΌ Ρ Π·Π° Π»Π°ΡΡΡΠ½ΠΊΠ°ΠΌΠΈ, Π²ΠΎΠ½ΠΈ **Π½Π΅** Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡΡΡ **JavaScript** Π»Π΅Π³ΠΊΠΎ Π²Π·Π°ΡΠΌΠΎΠ΄ΡΡΡΠΈ Π· Π½ΠΈΠΌΠΈ.
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π£ ΡΡΠΎΠΌΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ ΠΌΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΠΌΠΎ Π²ΠΈΠ³Π°Π΄Π°Π½Ρ Π²Π»Π°ΡΠ½Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ `X-Key` Ρ `X-Token`.
end
```
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΈΡΠ΅ **ΠΎΠ΄Π½Π° Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ** Π±ΡΠ΄Π΅ Π½Π°Π΄ΡΡΠ»Π°Π½Π° ΠΊΠ»ΡΡΠ½ΡΡ. Π¦Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ ΠΎΠ΄Π½Π° Π· ΠΏΠΎΠΌΠΈΠ»ΠΊΠΎΠ²ΠΈΡ
Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π΅ΠΉ Π°Π±ΠΎ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ Π²ΡΠ΄ *ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ*.
ΠΠΎΡΡΠΌ Π²ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ²Π΅ΡΡΠ°Ρ `dict`, ΡΠΎ ΠΌΡΡΡΠΈΡΡ ΡΡ Π·Π½Π°ΡΠ΅Π½Π½Ρ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
FastAPI Π΄ΠΎΠ΄Π°Π² ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΡ `Annotated` (Ρ ΠΏΠΎΡΠ°Π² ΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ²Π°ΡΠΈ) Ρ Π²Π΅ΡΡΡΡ 0.95.0.
Π’Π°ΠΊΠΈΠΌ ΡΠΈΠ½ΠΎΠΌ Π²ΠΈ ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΏΡΠ»ΡΠ½ΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π° **FastAPI** ΠΏΠΎΠ΄Π±Π°Ρ ΠΏΡΠΎ ΠΉΠΎΠ³ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊ Π΄Π»Ρ Π²Π°ΡΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΠΉ ΡΠ»ΡΡ
Ρ*.
-/// check | ΠΠ΅ΡΠ΅Π²ΡΡΡΠ΅
+/// tip | ΠΠΎΡΠ°Π΄Π°
ΠΠ²Π΅ΡΠ½ΡΡΡ ΡΠ²Π°Π³Ρ, ΡΠΎ Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΡΡΠ²ΠΎΡΡΠ²Π°ΡΠΈ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ ΠΊΠ»Π°Ρ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ ΠΊΡΠ΄ΠΈΡΡ Ρ **FastAPI**, ΡΠΎΠ± Β«Π·Π°ΡΠ΅ΡΡΡΡΡΠ²Π°ΡΠΈΒ» ΠΉΠΎΠ³ΠΎ ΡΠΈ ΡΠΎΡΡ ΠΏΠΎΠ΄ΡΠ±Π½Π΅.
ΠΠ°Π»Π΅ΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ΄ΠΎΠ²ΠΆΠ°ΡΡ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈ ΡΠΊ ΠΎΡΡΠΊΡΡΡΡΡΡ, Ρ **Π½Π°ΠΉΠΊΡΠ°ΡΠ΅** ΡΠ΅, ΡΠΎ **ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ ΠΏΡΠΎ ΡΠΈΠΏΠΈ Π±ΡΠ΄Π΅ Π·Π±Π΅ΡΠ΅ΠΆΠ΅Π½Π°**, Π° ΡΠ΅ ΠΎΠ·Π½Π°ΡΠ°Ρ, ΡΠΎ Π²Π°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π·ΠΌΠΎΠΆΠ΅ ΠΉ Π½Π°Π΄Π°Π»Ρ Π½Π°Π΄Π°Π²Π°ΡΠΈ **Π°Π²ΡΠΎΠ·Π°ΠΏΠΎΠ²Π½Π΅Π½Π½Ρ**, **ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ Π² ΡΡΠ΄ΠΊΡ** ΡΠΎΡΠΎ. Π’Π΅ ΡΠ°ΠΌΠ΅ Ρ Π΄Π»Ρ ΡΠ½ΡΠΈΡ
ΡΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΠ², ΡΠΊ-ΠΎΡ `mypy`.
-Π¦Π΅ Π±ΡΠ΄Π΅ ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΎ Ρ **Π²Π΅Π»ΠΈΠΊΡΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΡΠΉ Π±Π°Π·Ρ**, Π΄Π΅ Π²ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅ **ΠΎΠ΄Π½Ρ ΠΉ ΡΡ ΡΠ°ΠΌΡ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ** Π·Π½ΠΎΠ²Ρ Ρ Π·Π½ΠΎΠ²Ρ Π² **Π±Π°Π³Π°ΡΡΠΎΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΡΡ
ΡΠ»ΡΡ
Ρ***.
+Π¦Π΅ Π±ΡΠ΄Π΅ ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΎ Ρ **Π²Π΅Π»ΠΈΠΊΡΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΡΠΉ Π±Π°Π·Ρ**, Π΄Π΅ Π²ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅ **ΠΎΠ΄Π½Ρ ΠΉ ΡΡ ΠΆ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ** Π·Π½ΠΎΠ²Ρ Ρ Π·Π½ΠΎΠ²Ρ Π² **Π±Π°Π³Π°ΡΡΠΎΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΡΡ
ΡΠ»ΡΡ
Ρ***.
## ΠΡΡΠΈ `async` ΡΠΈ Π½Π΅ Π±ΡΡΠΈ `async` { #to-async-or-not-to-async }
ΠΠΎΠ½ΠΈ ΠΌΠΎΠΆΡΡΡ Π±ΡΡΠΈ Π½Π°ΡΡΡΠ»ΡΠΊΠΈ Π³Π»ΠΈΠ±ΠΎΠΊΠΈΠΌΠΈ, Π½Π°ΡΠΊΡΠ»ΡΠΊΠΈ ΠΏΠΎΡΡΡΠ±Π½ΠΎ.
-FastAPI ΠΏΠΎΠ΄Π±Π°Ρ ΠΏΡΠΎ ΡΡ
ΡΠΎΠ·Π²'ΡΠ·Π°Π½Π½Ρ.
+**FastAPI** ΠΏΠΎΠ΄Π±Π°Ρ ΠΏΡΠΎ ΡΡ
ΡΠΎΠ·Π²'ΡΠ·Π°Π½Π½Ρ.
## ΠΠ΅ΡΡΠ° Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ Β«dependableΒ» { #first-dependency-dependable }
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ²Π΅ΡΠ½ΡΡΡ ΡΠ²Π°Π³Ρ, ΡΠΎ ΠΌΠΈ ΠΎΠ³ΠΎΠ»ΠΎΡΡΡΠΌΠΎ Π»ΠΈΡΠ΅ ΠΎΠ΄Π½Ρ Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ Ρ ΡΡΠ½ΠΊΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ β `query_or_cookie_extractor`.
-ΠΠ»Π΅ FastAPI Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΡΠΏΠΎΡΠ°ΡΠΊΡ ΡΡΠ΅Π±Π° ΡΠΎΠ·Π²'ΡΠ·Π°ΡΠΈ `query_extractor`, ΡΠΎΠ± ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Ρ `query_or_cookie_extractor` ΠΏΡΠ΄ ΡΠ°Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΡ.
+ΠΠ»Π΅ **FastAPI** Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΡΠΏΠΎΡΠ°ΡΠΊΡ ΡΡΠ΅Π±Π° ΡΠΎΠ·Π²'ΡΠ·Π°ΡΠΈ `query_extractor`, ΡΠΎΠ± ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Ρ `query_or_cookie_extractor` ΠΏΡΠ΄ ΡΠ°Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΡ.
///
## ΠΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ ΡΡΡΡ ΠΆ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ ΠΊΡΠ»ΡΠΊΠ° ΡΠ°Π·ΡΠ² { #using-the-same-dependency-multiple-times }
-Π―ΠΊΡΠΎ ΠΎΠ΄Π½Π° Π· Π²Π°ΡΠΈΡ
Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π° ΠΊΡΠ»ΡΠΊΠ° ΡΠ°Π·ΡΠ² Π΄Π»Ρ ΠΎΠ΄Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΠΊΡΠ»ΡΠΊΠ° Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΌΠ°ΡΡΡ ΡΠΏΡΠ»ΡΠ½Ρ ΠΏΡΠ΄Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ, FastAPI Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΡΡ ΠΏΡΠ΄Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΠ°ΡΠΈ Π»ΠΈΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° Π·Π°ΠΏΠΈΡ.
+Π―ΠΊΡΠΎ ΠΎΠ΄Π½Π° Π· Π²Π°ΡΠΈΡ
Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π° ΠΊΡΠ»ΡΠΊΠ° ΡΠ°Π·ΡΠ² Π΄Π»Ρ ΠΎΠ΄Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΠΊΡΠ»ΡΠΊΠ° Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΌΠ°ΡΡΡ ΡΠΏΡΠ»ΡΠ½Ρ ΠΏΡΠ΄Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ, **FastAPI** Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΡΡ ΠΏΡΠ΄Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΠ°ΡΠΈ Π»ΠΈΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° Π·Π°ΠΏΠΈΡ.
Π Π²ΡΠ½ Π·Π±Π΅ΡΠ΅ΠΆΠ΅ ΠΏΠΎΠ²Π΅ΡΠ½ΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½Π½Ρ Ρ <dfn title="Π£ΡΠΈΠ»ΡΡΠ°/ΡΠΈΡΡΠ΅ΠΌΠ° Π΄Π»Ρ Π·Π±Π΅ΡΠ΅ΠΆΠ΅Π½Π½Ρ ΠΎΠ±ΡΠΈΡΠ»Π΅Π½ΠΈΡ
/Π·Π³Π΅Π½Π΅ΡΠΎΠ²Π°Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½Ρ, ΡΠΎΠ± ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΡΡ
Π·Π°ΠΌΡΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠΈΡΠ»Π΅Π½Π½Ρ.">Β«ΠΊΠ΅ΡΒ»</dfn> Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡ ΠΉΠΎΠ³ΠΎ Π²ΡΡΠΌ Β«dependantsΒ», ΡΠΊΠΈΠΌ Π²ΠΎΠ½ΠΎ ΠΏΠΎΡΡΡΠ±Π½Π΅ Π² ΡΡΠΎΠΌΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ Π·Π°ΠΏΠΈΡΡ, Π·Π°ΠΌΡΡΡΡ ΡΠΎΠ³ΠΎ ΡΠΎΠ± Π²ΠΈΠΊΠ»ΠΈΠΊΠ°ΡΠΈ Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ ΠΊΡΠ»ΡΠΊΠ° ΡΠ°Π·ΡΠ² Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΉ ΡΠΎΠ³ΠΎ ΠΆ Π·Π°ΠΏΠΈΡΡ.
## ΠΡΠ΄ΡΡΠΌΠΎΠΊ { #recap }
-ΠΠΎΠΏΡΠΈ Π²ΡΡ ΠΌΠΎΠ΄Π½Ρ ΡΠ΅ΡΠΌΡΠ½ΠΈ, ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΠΏΡΠΎΠ²Π°Π΄ΠΆΠ΅Π½Π½Ρ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π΄ΠΎΡΠΈΡΡ ΠΏΡΠΎΡΡΠ°.
+ΠΠΎΠΏΡΠΈ Π²ΡΡ ΠΌΠΎΠ΄Π½Ρ ΡΠ΅ΡΠΌΡΠ½ΠΈ, ΡΠΈΡΡΠ΅ΠΌΠ° **Π²ΠΏΡΠΎΠ²Π°Π΄ΠΆΠ΅Π½Π½Ρ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ** Π΄ΠΎΡΠΈΡΡ ΠΏΡΠΎΡΡΠ°.
Π¦Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ½ΠΊΡΡΡ, ΡΠΊΡ Π²ΠΈΠ³Π»ΡΠ΄Π°ΡΡΡ ΡΠ°ΠΊ ΡΠ°ΠΌΠΎ, ΡΠΊ ΡΡΠ½ΠΊΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΡΠΉ ΡΠ»ΡΡ
Ρ.
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 app, ΡΠΊΠΈΠΉ ΡΠ»ΡΠ΄ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ:
$ 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 }
-Γ\9fΓΒΎΓ\82Γ\96ΓΒΌ Γ\80ΓΒΎΓΒ·ΓΒ³ΓΒΎΓ\80ΓΒ½Γ\96Γ\82Γ\8c ΓΒ²ΓΒ°Γ\88 ΓΒ·ΓΒ°Γ\81Γ\82ΓΒΎΓ\81Γ\83ΓΒ½ΓΒΎΓΒΊ:
+Γ\97ΓΒ° ΓΒ±ΓΒ°ΓΒΆΓΒ°ΓΒ½ΓΒ½Γ\8fΓΒΌ ΓΒ²ΓΒΈ ΓΒΌΓΒΎΓΒΆΓΒ΅Γ\82ΓΒ΅ Γ\80ΓΒΎΓΒ·ΓΒ³ΓΒΎΓ\80ΓΒ½Γ\83Γ\82ΓΒΈ ΓΒ²ΓΒ°Γ\88 FastAPI-ΓΒ·ΓΒ°Γ\81Γ\82ΓΒΎΓ\81Γ\83ΓΒ½ΓΒΎΓΒΊ Γ\83 [FastAPI Cloud](https://fastapicloud.com) ΓΒΎΓΒ΄ΓΒ½Γ\96Γ\94Γ\8e ΓΒΊΓΒΎΓΒΌΓΒ°ΓΒ½ΓΒ΄ΓΒΎΓ\8e. Γ°\9f\9a\80
<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 Π½Π°Π·ΠΈΠ²Π°ΡΡΡΡΡ Β«Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠΌΒ».
* `@app.patch()`
* `@app.trace()`
-/// tip
+/// tip | ΠΠΎΡΠ°Π΄Π°
ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΠΊΠΎΠΆΠ½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ (HTTP-ΠΌΠ΅ΡΠΎΠ΄) ΡΠΊ Π·Π°Π±Π°ΠΆΠ°ΡΡΠ΅.
{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
-/// note
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π―ΠΊΡΠΎ Π²ΠΈ Π½Π΅ Π·Π½Π°ΡΡΠ΅ ΡΡΠ·Π½ΠΈΡΡ, ΠΏΠΎΠ΄ΠΈΠ²ΡΡΡΡΡ [ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡΡΡ: *Β«ΠΠΎΡΠΏΡΡΠ°ΡΡΠ΅?Β»*](../async.md#in-a-hurry).
# ΠΠ΅ΡΠ°Π΄Π°Π½Ρ ΡΠ° URL-Π°Π΄ΡΠ΅ΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ { #metadata-and-docs-urls }
-Γ\92ΓΒΈ ΓΒΌΓΒΎΓΒΆΓΒ΅Γ\82ΓΒ΅ ΓΒ½ΓΒ°ΓΒ»ΓΒ°Γ\88Γ\82Γ\83ΓΒ²ΓΒ°Γ\82ΓΒΈ ΓΒΊΓ\96ΓΒ»Γ\8cΓΒΊΓΒ° ΓΒΊΓΒΎΓΒ½Γ\84Γ\96ΓΒ³Γ\83Γ\80ΓΒ°Γ\86Γ\96ΓΒΉ ΓΒΌΓΒ΅Γ\82ΓΒ°ΓΒ΄ΓΒ°ΓΒ½ΓΒΈΓ\85 Γ\83 Γ\92Π°ΡΠΎΠΌΡ Π΄ΠΎΠ΄Π°ΡΠΊΡ **FastAPI**.
+Γ\92ΓΒΈ ΓΒΌΓΒΎΓΒΆΓΒ΅Γ\82ΓΒ΅ ΓΒ½ΓΒ°ΓΒ»ΓΒ°Γ\88Γ\82Γ\83ΓΒ²ΓΒ°Γ\82ΓΒΈ ΓΒΊΓ\96ΓΒ»Γ\8cΓΒΊΓΒ° ΓΒΊΓΒΎΓΒ½Γ\84Γ\96ΓΒ³Γ\83Γ\80ΓΒ°Γ\86Γ\96ΓΒΉ ΓΒΌΓΒ΅Γ\82ΓΒ°ΓΒ΄ΓΒ°ΓΒ½ΓΒΈΓ\85 Γ\83 ΓΒ²Π°ΡΠΎΠΌΡ Π΄ΠΎΠ΄Π°ΡΠΊΡ **FastAPI**.
## ΠΠ΅ΡΠ°Π΄Π°Π½Ρ Π΄Π»Ρ API { #metadata-for-api }
| `title` | `str` | ΠΠ°Π·Π²Π° API. |
| `summary` | `str` | ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΡΠ΄ΡΡΠΌΠΎΠΊ API. <small>ΠΠΎΡΡΡΠΏΠ½ΠΎ Π· OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
| `description` | `str` | ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΠΎΠΏΠΈΡ API. ΠΠΎΠΆΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ Markdown. |
-| `version` | `string` | Γ\92ΓΒ΅Γ\80Γ\81Γ\96Γ\8f API. ΓΒ¦ΓΒ΅ ΓΒ²ΓΒ΅Γ\80Γ\81Γ\96Γ\8f Γ\92Π°ΡΠΎΠ³ΠΎ Π΄ΠΎΠ΄Π°ΡΠΊΠ°, Π° Π½Π΅ OpenAPI. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, `2.5.0`. |
+| `version` | `string` | Γ\92ΓΒ΅Γ\80Γ\81Γ\96Γ\8f API. ΓΒ¦ΓΒ΅ ΓΒ²ΓΒ΅Γ\80Γ\81Γ\96Γ\8f ΓΒ²Π°ΡΠΎΠ³ΠΎ Π΄ΠΎΠ΄Π°ΡΠΊΠ°, Π° Π½Π΅ OpenAPI. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, `2.5.0`. |
| `terms_of_service` | `str` | URL Π΄ΠΎ ΡΠΌΠΎΠ² Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ API. Π―ΠΊΡΠΎ Π²ΠΊΠ°Π·Π°Π½ΠΎ, ΠΌΠ°Ρ Π±ΡΡΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΡ URL. |
| `contact` | `dict` | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ°ΠΊΡΡ Π· ΠΎΠΏΡΠ±Π»ΡΠΊΠΎΠ²Π°Π½ΠΈΠΌ API. ΠΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ ΠΊΡΠ»ΡΠΊΠ° ΠΏΠΎΠ»ΡΠ². <details><summary><code>contact</code> ΠΏΠΎΠ»Ρ</summary><table><thead><tr><th>ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ</th><th>Π’ΠΈΠΏ</th><th>ΠΠΏΠΈΡ</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>ΠΠ΄Π΅Π½ΡΠΈΡΡΠΊΠ°ΡΡΠΉΠ½Π΅ ΡΠΌ'Ρ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ½ΠΎΡ ΠΎΡΠΎΠ±ΠΈ Π°Π±ΠΎ ΠΎΡΠ³Π°Π½ΡΠ·Π°ΡΡΡ.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL, ΡΠΎ Π²ΠΊΠ°Π·ΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ½Ρ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ. <strong>ΠΠΠ</strong> Π±ΡΡΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΡ URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>ΠΠ΄ΡΠ΅ΡΠ° Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΡ ΠΏΠΎΡΡΠΈ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ½ΠΎΡ ΠΎΡΠΎΠ±ΠΈ Π°Π±ΠΎ ΠΎΡΠ³Π°Π½ΡΠ·Π°ΡΡΡ. <strong>ΠΠΠ</strong> Π±ΡΡΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΡ Π°Π΄ΡΠ΅ΡΠΈ Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΡ ΠΏΠΎΡΡΠΈ.</td></tr></tbody></table></details> |
| `license_info` | `dict` | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ ΠΏΡΠΎ Π»ΡΡΠ΅Π½Π·ΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ±Π»ΡΠΊΠΎΠ²Π°Π½ΠΎΠ³ΠΎ API. ΠΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ ΠΊΡΠ»ΡΠΊΠ° ΠΏΠΎΠ»ΡΠ². <details><summary><code>license_info</code> ΠΏΠΎΠ»Ρ</summary><table><thead><tr><th>ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ</th><th>Π’ΠΈΠΏ</th><th>ΠΠΏΠΈΡ</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ΠΠΠΠ'Π―ΠΠΠΠΠ</strong> (ΡΠΊΡΠΎ Π²ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ <code>license_info</code>). ΠΠ°Π·Π²Π° Π»ΡΡΠ΅Π½Π·ΡΡ Π΄Π»Ρ API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>ΠΡΡΠ΅Π½Π·ΡΠΉΠ½ΠΈΠΉ Π²ΠΈΡΠ°Π· Π·Π° [SPDX](https://spdx.org/licenses/) Π΄Π»Ρ API. ΠΠΎΠ»Π΅ <code>identifier</code> Π²Π·Π°ΡΠΌΠΎΠ²ΠΈΠΊΠ»ΡΡΠ½Π΅ Π· ΠΏΠΎΠ»Π΅ΠΌ <code>url</code>. <small>ΠΠΎΡΡΡΠΏΠ½ΠΎ Π· OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL Π΄ΠΎ Π»ΡΡΠ΅Π½Π·ΡΡ, ΡΠΊΠ° Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ Π΄Π»Ρ API. <strong>ΠΠΠ</strong> Π±ΡΡΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΡ URL.</td></tr></tbody></table></details> |
## ΠΠ΄Π΅Π½ΡΠΈΡΡΠΊΠ°ΡΠΎΡ Π»ΡΡΠ΅Π½Π·ΡΡ { #license-identifier }
-Γ\97 ΓΒΏΓΒΎΓ\87ΓΒ°Γ\82ΓΒΊΓ\83 ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒ°ΓΒ½ΓΒ½Γ\8f OpenAPI 3.1.0 Γ\82ΓΒ° FastAPI 0.99.0 Γ\92ΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Π»Π°ΡΡΡΠ²Π°ΡΠΈ `license_info` Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ `identifier` Π·Π°ΠΌΡΡΡΡ `url`.
+Γ\97 ΓΒΏΓΒΎΓ\87ΓΒ°Γ\82ΓΒΊΓ\83 ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒ°ΓΒ½ΓΒ½Γ\8f OpenAPI 3.1.0 Γ\82ΓΒ° FastAPI 0.99.0 ΓΒ²ΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Π»Π°ΡΡΡΠ²Π°ΡΠΈ `license_info` Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ `identifier` Π·Π°ΠΌΡΡΡΡ `url`.
ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄:
ΠΠΎΠΆΠ΅Π½ ΡΠ»ΠΎΠ²Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ:
-* `name` (**ΓΒΎΓΒ±ΓΒΎΓΒ²'Γ\8fΓΒ·ΓΒΊΓΒΎΓΒ²ΓΒΎ**): `str` ΓΒ· Γ\82Γ\96Γ\94Γ\8e ΓΒΆ ΓΒ½ΓΒ°ΓΒ·ΓΒ²ΓΒΎΓ\8e Γ\82ΓΒ΅ΓΒ³Γ\83, Γ\8fΓΒΊΓ\83 Γ\92ΓΒΈ ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒΎΓΒ²Γ\83Γ\94Γ\82ΓΒ΅ Γ\83 ΓΒΏΓΒ°Γ\80ΓΒ°ΓΒΌΓΒ΅Γ\82Γ\80Γ\96 `tags` Γ\83 Γ\92Π°ΡΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΡΡ
ΡΠ»ΡΡ
Ρ* ΡΠ° `APIRouter`s.
+* `name` (**ΓΒΎΓΒ±ΓΒΎΓΒ²'Γ\8fΓΒ·ΓΒΊΓΒΎΓΒ²ΓΒΎ**): `str` ΓΒ· Γ\82Γ\96Γ\94Γ\8e ΓΒΆ ΓΒ½ΓΒ°ΓΒ·ΓΒ²ΓΒΎΓ\8e Γ\82ΓΒ΅ΓΒ³Γ\83, Γ\8fΓΒΊΓ\83 ΓΒ²ΓΒΈ ΓΒ²ΓΒΈΓΒΊΓΒΎΓ\80ΓΒΈΓ\81Γ\82ΓΒΎΓΒ²Γ\83Γ\94Γ\82ΓΒ΅ Γ\83 ΓΒΏΓΒ°Γ\80ΓΒ°ΓΒΌΓΒ΅Γ\82Γ\80Γ\96 `tags` Γ\83 ΓΒ²Π°ΡΠΈΡ
*ΠΎΠΏΠ΅ΡΠ°ΡΡΡΡ
ΡΠ»ΡΡ
Ρ* ΡΠ° `APIRouter`s.
* `description`: `str` Π· ΠΊΠΎΡΠΎΡΠΊΠΈΠΌ ΠΎΠΏΠΈΡΠΎΠΌ ΡΠ΅Π³Ρ. ΠΠΎΠΆΠ΅ ΠΌΡΡΡΠΈΡΠΈ Markdown Ρ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ.
* `externalDocs`: `dict`, ΡΠΊΠΈΠΉ ΠΎΠΏΠΈΡΡΡ Π·ΠΎΠ²Π½ΡΡΠ½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ Π· ΡΠ°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ:
* `description`: `str` Π· ΠΊΠΎΡΠΎΡΠΊΠΈΠΌ ΠΎΠΏΠΈΡΠΎΠΌ Π·ΠΎΠ²Π½ΡΡΠ½ΡΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ.
/// tip | ΠΠΎΡΠ°Π΄Π°
-Γ\92ΓΒ°ΓΒΌ ΓΒ½ΓΒ΅ ΓΒΏΓΒΎΓ\82Γ\80Γ\96ΓΒ±ΓΒ½ΓΒΎ ΓΒ΄ΓΒΎΓΒ΄ΓΒ°ΓΒ²ΓΒ°Γ\82ΓΒΈ ΓΒΌΓΒ΅Γ\82ΓΒ°ΓΒ΄ΓΒ°ΓΒ½Γ\96 ΓΒ΄ΓΒ»Γ\8f ΓΒ²Γ\81Γ\96Γ\85 Γ\82ΓΒ΅ΓΒ³Γ\96ΓΒ², Γ\8fΓΒΊΓ\96 Γ\92ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅.
+Γ\92ΓΒ°ΓΒΌ ΓΒ½ΓΒ΅ ΓΒΏΓΒΎΓ\82Γ\80Γ\96ΓΒ±ΓΒ½ΓΒΎ ΓΒ΄ΓΒΎΓΒ΄ΓΒ°ΓΒ²ΓΒ°Γ\82ΓΒΈ ΓΒΌΓΒ΅Γ\82ΓΒ°ΓΒ΄ΓΒ°ΓΒ½Γ\96 ΓΒ΄ΓΒ»Γ\8f ΓΒ²Γ\81Γ\96Γ\85 Γ\82ΓΒ΅ΓΒ³Γ\96ΓΒ², Γ\8fΓΒΊΓ\96 ΓΒ²ΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠ΅.
///
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΡΠ΅ ΠΏΡΠΎ ΡΠ΅Π³ΠΈ ΡΠΈΡΠ°ΠΉΡΠ΅ Π² ΡΠΎΠ·Π΄ΡΠ»Ρ [ΠΠΎΠ½ΡΡΠ³ΡΡΠ°ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ](path-operation-configuration.md#tags).
### ΠΠ΅ΡΠ΅Π²ΡΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ { #check-the-docs }
-ΓΒ’ΓΒ΅ΓΒΏΓΒ΅Γ\80, Γ\8fΓΒΊΓ\89ΓΒΎ Γ\92ΠΈ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΈΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ, Π²ΠΎΠ½Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π²ΡΡ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Ρ:
+ΓΒ’ΓΒ΅ΓΒΏΓΒ΅Γ\80, Γ\8fΓΒΊΓ\89ΓΒΎ ΓΒ²ΠΈ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΈΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ, Π²ΠΎΠ½Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π²ΡΡ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Ρ:
<img src="/img/tutorial/metadata/image02.png">
ΠΠ° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ ΡΡ
Π΅ΠΌΠ° OpenAPI Π½Π°Π΄Π°ΡΡΡΡΡ Π·Π° Π°Π΄ΡΠ΅ΡΠΎΡ `/openapi.json`.
-Γ\90ΓΒ»ΓΒ΅ Γ\92ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Π»Π°ΡΡΡΠ²Π°ΡΠΈ ΡΠ΅ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `openapi_url`.
+Γ\90ΓΒ»ΓΒ΅ ΓΒ²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Π»Π°ΡΡΡΠ²Π°ΡΠΈ ΡΠ΅ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `openapi_url`.
ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΡΠΎΠ± Π½Π°Π»Π°ΡΡΡΠ²Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ Π½Π° `/api/v1/openapi.json`:
{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
-ΓΒ―ΓΒΊΓ\89ΓΒΎ Γ\92ΓΒΈ Γ\85ΓΒΎΓ\87ΓΒ΅Γ\82ΓΒ΅ ΓΒΏΓΒΎΓΒ²ΓΒ½Γ\96Γ\81Γ\82Γ\8e ΓΒ²ΓΒΈΓΒΌΓΒΊΓΒ½Γ\83Γ\82ΓΒΈ Γ\81Γ\85ΓΒ΅ΓΒΌΓ\83 OpenAPI, Γ\92ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ `openapi_url=None`, ΡΠ΅ ΡΠ°ΠΊΠΎΠΆ Π²ΠΈΠΌΠΊΠ½Π΅ ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ, ΡΠΊΡ ΡΡ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡ.
+ΓΒ―ΓΒΊΓ\89ΓΒΎ ΓΒ²ΓΒΈ Γ\85ΓΒΎΓ\87ΓΒ΅Γ\82ΓΒ΅ ΓΒΏΓΒΎΓΒ²ΓΒ½Γ\96Γ\81Γ\82Γ\8e ΓΒ²ΓΒΈΓΒΌΓΒΊΓΒ½Γ\83Γ\82ΓΒΈ Γ\81Γ\85ΓΒ΅ΓΒΌΓ\83 OpenAPI, ΓΒ²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ `openapi_url=None`, ΡΠ΅ ΡΠ°ΠΊΠΎΠΆ Π²ΠΈΠΌΠΊΠ½Π΅ ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ, ΡΠΊΡ ΡΡ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡ.
## URL-Π°Π΄ΡΠ΅ΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ { #docs-urls }
{* ../../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 | ΠΡΠΈΠΌΡΡΠΊΠ°
FastAPI Π΄ΠΎΠ΄Π°Π² ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΡ `Annotated` (Ρ ΠΏΠΎΡΠ°Π² ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ²Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ) Ρ Π²Π΅ΡΡΡΡ 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"`.
Π’Π° ΡΠ°ΠΌΠ° ΠΏΠΎΠΌΠΈΠ»ΠΊΠ° Π·βΡΠ²ΠΈΡΡΡΡ, ΡΠΊΡΠΎ Π²ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠ΅ `float` Π·Π°ΠΌΡΡΡΡ `int`, ΡΠΊ Ρ: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | ΠΠ΅ΡΠ΅Π²ΡΡΡΠ΅
+/// tip | ΠΠΎΡΠ°Π΄Π°
ΠΡΠΆΠ΅, Π· ΡΠΈΠΌ ΡΠ°ΠΌΠΈΠΌ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π½ΡΠΌ ΡΠΈΠΏΡ Π² Python **FastAPI** Π½Π°Π΄Π°Ρ Π²Π°ΠΌ Π²Π°Π»ΡΠ΄Π°ΡΡΡ Π΄Π°Π½ΠΈΡ
.
<img src="/img/tutorial/path-params/image01.png">
-/// check | ΠΠ΅ΡΠ΅Π²ΡΡΡΠ΅
+/// tip | ΠΠΎΡΠ°Π΄Π°
ΠΠ½ΠΎΠ²Ρ ΠΆ ΡΠ°ΠΊΠΈ, Π»ΠΈΡΠ΅ Π· ΡΠΈΠΌ ΡΠ°ΠΌΠΈΠΌ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π½ΡΠΌ ΡΠΈΠΏΡ Π² Python **FastAPI** Π½Π°Π΄Π°Ρ Π²Π°ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Ρ, ΡΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ (Π· ΡΠ½ΡΠ΅Π³ΡΠ°ΡΡΡΡ Swagger UI).
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
FastAPI Π΄ΠΎΠ΄Π°Π² ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΡ `Annotated` (Ρ ΠΏΠΎΡΠ°Π² ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ²Π°ΡΠΈ ΠΉΠΎΠ³ΠΎ) Ρ Π²Π΅ΡΡΡΡ 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` Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠ»ΡΡ
Ρ, Π° `q` β Π½Ρ, ΠΎΡΠΆΠ΅, ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ query.
ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ·Π½Π°ΡΠΈΡΠΈ ΡΠ°ΠΉΠ»ΠΈ, ΡΠΊΡ Π±ΡΠ΄ΡΡΡ Π·Π°Π²Π°Π½ΡΠ°ΠΆΡΠ²Π°ΡΠΈΡΡ ΠΊΠ»ΡΡΠ½ΡΠΎΠΌ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ `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`.
Π£ FastAPI Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ **Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ** Π΄Π»Ρ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Π½Ρ **ΠΏΠΎΠ»ΡΠ² ΡΠΎΡΠΌΠΈ**.
-/// info
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π©ΠΎΠ± Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΡΠΎΡΠΌΠΈ, ΡΠΏΠΎΡΠ°ΡΠΊΡ Π²ΡΡΠ°Π½ΠΎΠ²ΡΡΡ [`python-multipart`](https://github.com/Kludex/python-multipart).
///
-/// note
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π¦Π΅ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ, ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· FastAPI Π²Π΅ΡΡΡΡ `0.113.0`. π€
Π£ Π΄Π΅ΡΠΊΠΈΡ
ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΈΡ
Π²ΠΈΠΏΠ°Π΄ΠΊΠ°Ρ
(ΠΉΠΌΠΎΠ²ΡΡΠ½ΠΎ, Π½Π΅ Π΄ΡΠΆΠ΅ ΠΏΠΎΡΠΈΡΠ΅Π½ΠΈΡ
) Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ **ΠΎΠ±ΠΌΠ΅ΠΆΠΈΡΠΈ** ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΠΈ Π»ΠΈΡΠ΅ ΡΠΈΠΌΠΈ, ΡΠΊΡ Π±ΡΠ»ΠΈ ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½Ρ Π² Pydantic-ΠΌΠΎΠ΄Π΅Π»Ρ. Π **Π·Π°Π±ΠΎΡΠΎΠ½ΠΈΡΠΈ** Π±ΡΠ΄Ρ-ΡΠΊΡ **Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²Ρ** ΠΏΠΎΠ»Ρ.
-/// note
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π¦Π΅ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ, ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· FastAPI Π²Π΅ΡΡΡΡ `0.114.0`. π€
ΠΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠ°ΡΠ½ΠΎ Π²ΠΈΠ·Π½Π°ΡΠ°ΡΠΈ ΡΠ°ΠΉΠ»ΠΈ ΡΠ° ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΠΈ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ `File` Ρ `Form`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π©ΠΎΠ± ΠΎΡΡΠΈΠΌΡΠ²Π°ΡΠΈ Π·Π°Π²Π°Π½ΡΠ°ΠΆΠ΅Π½Ρ ΡΠ°ΠΉΠ»ΠΈ ΡΠ°/Π°Π±ΠΎ Π΄Π°Π½Ρ ΡΠΎΡΠΌΠΈ, ΡΠΏΠΎΡΠ°ΡΠΊΡ Π²ΡΡΠ°Π½ΠΎΠ²ΡΡΡ [`python-multipart`](https://github.com/Kludex/python-multipart).
ΠΠΎΠ»ΠΈ Π²Π°ΠΌ ΠΏΠΎΡΡΡΠ±Π½ΠΎ ΠΎΡΡΠΈΠΌΡΠ²Π°ΡΠΈ ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΠΈ Π·Π°ΠΌΡΡΡΡ JSON, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ `Form`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π©ΠΎΠ± Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΡΠΎΡΠΌΠΈ, ΡΠΏΠΎΡΠ°ΡΠΊΡ Π²ΡΡΠ°Π½ΠΎΠ²ΡΡΡ [`python-multipart`](https://github.com/Kludex/python-multipart).
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
-ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΠΎΠ΄ΠΈΠ½ Π·Ρ ΡΠΏΠΎΡΠΎΠ±ΡΠ² Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ OAuth2 (ΡΠ°ΠΊ Π·Π²Π°Π½ΠΈΠΉ Β«password flowΒ») Π²ΠΈΠΌΠ°Π³Π°Ρ Π½Π°Π΄ΡΠΈΠ»Π°ΡΠΈ `username` ΡΠ° `password` ΡΠΊ ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΠΈ.
+ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΠΎΠ΄ΠΈΠ½ Π·Ρ ΡΠΏΠΎΡΠΎΠ±ΡΠ² Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ OAuth2 (ΡΠ°ΠΊ Π·Π²Π°Π½ΠΈΠΉ Β«ΠΏΠΎΡΡΠΊ ΠΏΠ°ΡΠΎΠ»ΡΒ») Π²ΠΈΠΌΠ°Π³Π°Ρ Π½Π°Π΄ΡΠΈΠ»Π°ΡΠΈ `username` ΡΠ° `password` ΡΠΊ ΠΏΠΎΠ»Ρ ΡΠΎΡΠΌΠΈ.
<dfn title="ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ">ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ</dfn> Π²ΠΈΠΌΠ°Π³Π°Ρ, ΡΠΎΠ± ΡΡ ΠΏΠΎΠ»Ρ ΠΌΠ°Π»ΠΈ ΡΠΎΡΠ½Ρ Π½Π°Π·Π²ΠΈ `username` Ρ `password` ΡΠ° Π½Π°Π΄ΡΠΈΠ»Π°Π»ΠΈΡΡ Ρ Π²ΠΈΠ³Π»ΡΠ΄Ρ ΠΏΠΎΠ»ΡΠ² ΡΠΎΡΠΌΠΈ, Π° Π½Π΅ JSON.
Π `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).
### ΠΠΎΠ²Π΅ΡΠ½ΡΡΠΈ Response Π½Π°ΠΏΡΡΠΌΡ { #return-a-response-directly }
-ΠΠ°ΠΉΠΏΠΎΡΠΈΡΠ΅Π½ΡΡΠΈΠΌ Π²ΠΈΠΏΠ°Π΄ΠΊΠΎΠΌ Π±ΡΠ΄Π΅ [ΠΏΠΎΠ²Π΅ΡΠ½Π΅Π½Π½Ρ Response Π½Π°ΠΏΡΡΠΌΡ, ΡΠΊ ΠΏΠΎΡΡΠ½ΡΡΡΡΡΡ ΠΏΡΠ·Π½ΡΡΠ΅ Ρ ΡΠΎΠ·ΡΠΈΡΠ΅Π½ΡΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ](../advanced/response-directly.md).
+ΠΠ°ΠΉΠΏΠΎΡΠΈΡΠ΅Π½ΡΡΠΈΠΌ Π²ΠΈΠΏΠ°Π΄ΠΊΠΎΠΌ Π±ΡΠ΄Π΅ [ΠΏΠΎΠ²Π΅ΡΠ½Π΅Π½Π½Ρ Response Π½Π°ΠΏΡΡΠΌΡ, ΡΠΊ ΠΏΠΎΡΡΠ½ΡΡΡΡΡΡ ΠΏΡΠ·Π½ΡΡΠ΅ Ρ ΠΏΡΠΎΡΡΠ½ΡΡΠΎΠΌΡ ΠΏΠΎΡΡΠ±Π½ΠΈΠΊΡ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ°](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
}
```
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ:
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ `status_code` ΠΏΡΠΈΠΉΠΌΠ°Ρ ΡΠΈΡΠ»ΠΎ Π· HTTP ΠΊΠΎΠ΄ΠΎΠΌ ΡΡΠ°ΡΡΡΡ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
`status_code` ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅, ΡΠΊ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ, ΠΏΡΠΈΠΉΠΌΠ°ΡΠΈ `IntEnum`, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus).
///
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
OpenAPI 3.1.0 (ΡΠΊΠΈΠΉ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· FastAPI 0.99.0) Π΄ΠΎΠ΄Π°Π² ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΡ `examples`, ΡΠΎ Ρ ΡΠ°ΡΡΠΈΠ½ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ **Π‘Ρ
Π΅ΠΌΠΈ JSON**.
* `File()`
* `Form()`
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π¦Π΅ΠΉ ΡΡΠ°ΡΠΈΠΉ ΡΠΏΠ΅ΡΠΈΡΡΡΠ½ΠΈΠΉ Π΄Π»Ρ OpenAPI ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `examples` ΡΠ΅ΠΏΠ΅Ρ Π½Π°Π·ΠΈΠ²Π°ΡΡΡΡΡ `openapi_examples`, ΠΏΠΎΡΠΈΠ½Π°ΡΡΠΈ Π· FastAPI `0.103.0`.
Π¦Π΅ Π½ΠΎΠ²Π΅ ΠΏΠΎΠ»Π΅ `examples` Ρ Π‘Ρ
Π΅ΠΌΡ JSON - ΡΠ΅ **ΠΏΡΠΎΡΡΠΎ `list`** ΠΏΡΠΈΠΊΠ»Π°Π΄ΡΠ², Π° Π½Π΅ `dict` Π· Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²ΠΈΠΌΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½ΠΈΠΌΠΈ, ΡΠΊ Π² ΡΠ½ΡΠΈΡ
ΠΌΡΡΡΡΡ
OpenAPI (ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
Π²ΠΈΡΠ΅).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠ°Π²ΡΡΡ ΠΏΡΡΠ»Ρ ΡΠ΅Π»ΡΠ·Ρ OpenAPI 3.1.0 Π· ΡΡΡΡ Π½ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΡΡΡΠΎΡ ΡΠ½ΡΠ΅Π³ΡΠ°ΡΡΡΡ Π·Ρ Π‘Ρ
Π΅ΠΌΠΎΡ JSON, ΠΏΡΠΎΡΡΠ³ΠΎΠΌ ΠΏΠ΅Π²Π½ΠΎΠ³ΠΎ ΡΠ°ΡΡ 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 | ΠΠ½ΠΎΠΏΠΊΠ° Authorize!
+/// tip | ΠΠ½ΠΎΠΏΠΊΠ° Authorize!
Π£ Π²Π°Ρ ΡΠΆΠ΅ Ρ Π½ΠΎΠ²Π° Π±Π»ΠΈΡΠΊΡΡΠ° ΠΊΠ½ΠΎΠΏΠΊΠ° Β«AuthorizeΒ».
Π£ ΡΡΠΎΠΌΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ ΠΌΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΌΠΎ **OAuth2** Π· ΠΏΠΎΡΠΎΠΊΠΎΠΌ **Password**, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ ΡΠΎΠΊΠ΅Π½ **Bearer**. Π¦Π΅ ΡΠΎΠ±ΠΈΡΡΡΡ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡ ΠΊΠ»Π°ΡΡ `OAuth2PasswordBearer`.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Β«BearerΒ»-ΡΠΎΠΊΠ΅Π½ - Π½Π΅ ΡΠ΄ΠΈΠ½ΠΈΠΉ Π²Π°ΡΡΠ°Π½Ρ.
ΠΠ΅Π·Π°Π±Π°ΡΠΎΠΌ ΠΌΠΈ ΡΠ°ΠΊΠΎΠΆ ΡΡΠ²ΠΎΡΠΈΠΌΠΎ ΡΠ°ΠΊΡΠΈΡΠ½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΡΡ ΡΠ»ΡΡ
Ρ.
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
Π―ΠΊΡΠΎ Π²ΠΈ Π΄ΡΠΆΠ΅ ΡΡΡΠΎΠ³ΠΈΠΉ Β«PythonistaΒ», Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π°ΡΠΈΡΡ ΡΡΠΈΠ»Ρ ΡΠΌΠ΅Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° `tokenUrl` Π·Π°ΠΌΡΡΡΡ `token_url`.
**FastAPI** Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΠΌΠΎΠΆΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΡΡ Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ, ΡΠΎΠ± Π²ΠΈΠ·Π½Π°ΡΠΈΡΠΈ Β«ΡΡ
Π΅ΠΌΡ Π±Π΅Π·ΠΏΠ΅ΠΊΠΈΒ» Π² ΡΡ
Π΅ΠΌΡ OpenAPI (Ρ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΡΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΡΡ API).
-/// info | Π’Π΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ
+/// note | Π’Π΅Ρ
Π½ΡΡΠ½Ρ Π΄Π΅ΡΠ°Π»Ρ
**FastAPI** Π·Π½Π°ΡΠΈΠΌΠ΅, ΡΠΎ ΠΌΠΎΠΆΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°ΡΠΈ ΠΊΠ»Π°Ρ `OAuth2PasswordBearer` (ΠΎΠ³ΠΎΠ»ΠΎΡΠ΅Π½ΠΈΠΉ Ρ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ), ΡΠΎΠ± Π²ΠΈΠ·Π½Π°ΡΠΈΡΠΈ ΡΡ
Π΅ΠΌΡ Π±Π΅Π·ΠΏΠ΅ΠΊΠΈ Π² OpenAPI, ΡΠΎΠΌΡ ΡΠΎ Π²ΡΠ½ Π½Π°ΡΠ»ΡΠ΄ΡΡ `fastapi.security.oauth2.OAuth2`, ΡΠΊΠΈΠΉ ΡΠ²ΠΎΡΡ ΡΠ΅ΡΠ³ΠΎΡ Π½Π°ΡΠ»ΡΠ΄ΡΡ `fastapi.security.base.SecurityBase`.
///
-/// check | ΠΠ΅ΡΠ΅Π²ΡΡΡΠ΅
+/// tip | ΠΠΎΡΠ°Π΄Π°
Π’Π΅, ΡΠΊ ΡΠΏΡΠΎΡΠΊΡΠΎΠ²Π°Π½Π° ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΌΠ°ΡΠΈ ΡΡΠ·Π½Ρ Π·Π°Π»Π΅ΠΆΠ½ΠΎΡΡΡ (ΡΡΠ·Π½Ρ Β«Π·Π°Π»Π΅ΠΆΠ½ΡΒ»), ΡΠΊΡ Π²ΡΡ ΠΏΠΎΠ²Π΅ΡΡΠ°ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ `User`.
</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Β» β ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΡΠΎ ΠΎΠ³ΠΎΠ»ΠΎΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΠΎΡΡΡΠ±Π½ΠΈΠΉ Π΄ΠΎΠ·Π²ΡΠ».
- ΠΠ΅ΠΎΠ±ΠΎΠ²'ΡΠ·ΠΊΠΎΠ²ΠΈΠΌ `client_id` (Π΄Π»Ρ Π½Π°ΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ).
- ΠΠ΅ΠΎΠ±ΠΎΠ²'ΡΠ·ΠΊΠΎΠ²ΠΈΠΌ `client_secret` (Π΄Π»Ρ Π½Π°ΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
`OAuth2PasswordRequestForm` β Π½Π΅ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ ΠΊΠ»Π°Ρ Π΄Π»Ρ **FastAPI**, ΡΠΊ `OAuth2PasswordBearer`.
)
```
-/// 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 | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΎΠ΄Π°ΡΠΊΠΎΠ²ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `WWW-Authenticate` Π·Ρ Π·Π½Π°ΡΠ΅Π½Π½ΡΠΌ `Bearer`, ΡΠΊΠΈΠΉ ΠΌΠΈ ΡΡΡ ΠΏΠΎΠ²Π΅ΡΡΠ°ΡΠΌΠΎ, ΡΠ°ΠΊΠΎΠΆ Ρ ΡΠ°ΡΡΠΈΠ½ΠΎΡ ΡΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ.
Π¦Π΅ ΠΏΠΎΠ΄ΡΠ±Π½ΠΎ Π΄ΠΎ [ΠΠΎΡΡΠΊ JSON Lines](stream-json-lines.md), Π°Π»Π΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡ ΡΠΎΡΠΌΠ°Ρ `text/event-stream`, ΡΠΊΠΈΠΉ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠ΄ΡΡΠΈΠΌΡΡΡΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· [API `EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | ΠΠ½ΡΠΎΡΠΌΠ°ΡΡΡ
+/// note | ΠΡΠΈΠΌΡΡΠΊΠ°
ΠΠΎΠ΄Π°Π½ΠΎ Ρ FastAPI 0.135.0.
## Π‘ΠΈΡΡ Π΄Π°Π½Ρ { #raw-data }
-Π―ΠΊΡΠΎ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π½Π°Π΄ΡΡΠ»Π°ΡΠΈ Π΄Π°Π½Ρ **Π±Π΅Π·** ΠΊΠΎΠ΄ΡΠ²Π°Π½Π½Ρ Π² JSON, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠΉΡΠ΅ `raw_data` Π·Π°ΠΌΡΡΡΡ `data`.
+Π―ΠΊΡΠΎ ΠΏΠΎΡΡΡΠ±Π½ΠΎ Π½Π°Π΄ΡΡΠ»Π°ΡΠΈ Π΄Π°Π½Ρ Π±Π΅Π· ΠΊΠΎΠ΄ΡΠ²Π°Π½Π½Ρ Π² JSON, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠΉΡΠ΅ `raw_data` Π·Π°ΠΌΡΡΡΡ `data`.
Π¦Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π΄Π»Ρ Π½Π°Π΄ΡΠΈΠ»Π°Π½Π½Ρ ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄Π½ΡΠΎ Π²ΡΠ΄ΡΠΎΡΠΌΠ°ΡΠΎΠ²Π°Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΡ, ΡΡΠ΄ΠΊΡΠ² Π»ΠΎΠ³ΡΠ² Π°Π±ΠΎ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½Ρ <dfn title="ΠΠ½Π°ΡΠ΅Π½Π½Ρ, ΡΠΊΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ·Π½Π°ΡΠ΅Π½Π½Ρ ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎΡ ΡΠΌΠΎΠ²ΠΈ Π°Π±ΠΎ ΡΡΠ°Π½Ρ">Β«Π·Π½Π°ΡΠ΅Π½Π½Ρ-ΡΡΠΎΡΠΎΠΆΒ»</dfn>, ΡΠΊ-ΠΎΡ `[DONE]`.
## SSE Π· POST { #sse-with-post }
-SSE ΠΏΡΠ°ΡΡΡ Π· **Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΌ HTTP-ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ**, Π½Π΅ Π»ΠΈΡΠ΅ Π· `GET`.
+SSE ΠΏΡΠ°ΡΡΡ Π· Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΌ HTTP-ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, Π½Π΅ Π»ΠΈΡΠ΅ Π· `GET`.
Π¦Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΡΠ² Π½Π° ΠΊΡΡΠ°Π»Ρ [MCP](https://modelcontextprotocol.io), ΡΠΊΡ ΡΡΠ°Π½ΡΠ»ΡΡΡΡ SSE ΡΠ΅ΡΠ΅Π· `POST`:
FastAPI ΡΠ΅Π°Π»ΡΠ·ΡΡ Π΄Π΅ΡΠΊΡ Π½Π°ΠΉΠΊΡΠ°ΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ SSE Β«Π· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ».
-- ΠΠ°Π΄ΡΠΈΠ»Π°ΡΠΈ **ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ Β«keep aliveΒ» `ping`** ΠΊΠΎΠΆΠ½Ρ 15 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠΎΠ»ΠΈ Π½Π΅ Π±ΡΠ»ΠΎ ΠΆΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΡΠ΄ΠΎΠΌΠ»Π΅Π½Π½Ρ, ΡΠΎΠ± Π·Π°ΠΏΠΎΠ±ΡΠ³ΡΠΈ Π·Π°ΠΊΡΠΈΡΡΡ Π·'ΡΠ΄Π½Π°Π½Π½Ρ Π΄Π΅ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠΊΡΡ, ΡΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Ρ [Π‘ΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ HTML: ΠΠΎΠ΄ΡΡ, Π½Π°Π΄ΡΡΠ»Π°Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
-- ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Cache-Control: no-cache`, ΡΠΎΠ± **Π·Π°ΠΏΠΎΠ±ΡΠ³ΡΠΈ ΠΊΠ΅ΡΡΠ²Π°Π½Π½Ρ** ΠΏΠΎΡΠΎΠΊΡ.
-- ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΠΈ ΡΠΏΠ΅ΡΡΠ°Π»ΡΠ½ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `X-Accel-Buffering: no`, ΡΠΎΠ± **Π·Π°ΠΏΠΎΠ±ΡΠ³ΡΠΈ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΡΡ** Ρ Π΄Π΅ΡΠΊΠΈΡ
ΠΏΡΠΎΠΊΡΡ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄ Nginx.
+- ΠΠ°Π΄ΡΠΈΠ»Π°ΡΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ Β«keep aliveΒ» `ping` ΠΊΠΎΠΆΠ½Ρ 15 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠΎΠ»ΠΈ Π½Π΅ Π±ΡΠ»ΠΎ ΠΆΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΡΠ΄ΠΎΠΌΠ»Π΅Π½Π½Ρ, ΡΠΎΠ± Π·Π°ΠΏΠΎΠ±ΡΠ³ΡΠΈ Π·Π°ΠΊΡΠΈΡΡΡ Π·'ΡΠ΄Π½Π°Π½Π½Ρ Π΄Π΅ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠΊΡΡ, ΡΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Ρ [Π‘ΠΏΠ΅ΡΠΈΡΡΠΊΠ°ΡΡΡ HTML: ΠΠΎΠ΄ΡΡ, Π½Π°Π΄ΡΡΠ»Π°Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ](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-ΠΌΠΎΠ΄Π΅Π»Ρ.