diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a242407ea..bc725fafe 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,18 @@ hide: ## Latest Changes +### Translations + +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/bigger-applications.md`. PR [#13154](https://github.com/fastapi/fastapi/pull/13154) by [@alv2017](https://github.com/alv2017). + +## 0.115.7 + +### Upgrades + +* ⬆️ Upgrade `python-multipart` to >=0.0.18. PR [#13219](https://github.com/fastapi/fastapi/pull/13219) by [@DanielKusyDev](https://github.com/DanielKusyDev). +* ⬆️ Bump Starlette to allow up to 0.45.0: `>=0.40.0,<0.46.0`. PR [#13117](https://github.com/fastapi/fastapi/pull/13117) by [@Kludex](https://github.com/Kludex). +* ⬆️ Upgrade `jinja2` to >=3.1.5. PR [#13194](https://github.com/fastapi/fastapi/pull/13194) by [@DanielKusyDev](https://github.com/DanielKusyDev). + ### Refactors * βœ… Simplify tests for websockets. PR [#13202](https://github.com/fastapi/fastapi/pull/13202) by [@alejsdev](https://github.com/alejsdev). @@ -49,6 +61,7 @@ hide: ### Translations +* 🌐 Update Portuguese Translation for `docs/pt/docs/tutorial/request-forms.md`. PR [#13216](https://github.com/fastapi/fastapi/pull/13216) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Update Portuguese translation for `docs/pt/docs/advanced/settings.md`. PR [#13209](https://github.com/fastapi/fastapi/pull/13209) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/security/oauth2-jwt.md`. PR [#13205](https://github.com/fastapi/fastapi/pull/13205) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Indonesian translation for `docs/id/docs/index.md`. PR [#13191](https://github.com/fastapi/fastapi/pull/13191) by [@gerry-sabar](https://github.com/gerry-sabar). @@ -103,6 +116,7 @@ hide: ### Internal +* πŸ”§ Add Pydantic 2 trove classifier. PR [#13199](https://github.com/fastapi/fastapi/pull/13199) by [@johnthagen](https://github.com/johnthagen). * πŸ‘₯ Update FastAPI People - Sponsors. PR [#13231](https://github.com/fastapi/fastapi/pull/13231) by [@tiangolo](https://github.com/tiangolo). * πŸ‘· Refactor FastAPI People Sponsors to use 2 tokens. PR [#13228](https://github.com/fastapi/fastapi/pull/13228) by [@tiangolo](https://github.com/tiangolo). * πŸ‘· Update token for FastAPI People - Sponsors. PR [#13225](https://github.com/fastapi/fastapi/pull/13225) by [@tiangolo](https://github.com/tiangolo). diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md index 756ceb581..572ddf003 100644 --- a/docs/pt/docs/tutorial/request-forms.md +++ b/docs/pt/docs/tutorial/request-forms.md @@ -6,7 +6,11 @@ Quando vocΓͺ precisar receber campos de formulΓ‘rio ao invΓ©s de JSON, vocΓͺ pod Para usar formulΓ‘rios, primeiro instale `python-multipart`. -Ex: `pip install python-multipart`. +Lembre-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativΓ‘-lo e entΓ£o instalar a dependΓͺncia, por exemplo: + +```console +$ pip install python-multipart +``` /// diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md new file mode 100644 index 000000000..7c3dc288f --- /dev/null +++ b/docs/ru/docs/tutorial/bigger-applications.md @@ -0,0 +1,556 @@ +# Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ прилоТСния, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ² + +ΠŸΡ€ΠΈ построСнии прилоТСния ΠΈΠ»ΠΈ Π²Π΅Π±-API Π½Π°ΠΌ Ρ€Π΅Π΄ΠΊΠΎ удаСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ всё Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ». + +**FastAPI** прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ инструмСнтарий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΠΌ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, сохраняя ΠΏΡ€ΠΈ этом всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ. + +/// info | ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ + +Если Π²Ρ‹ Ρ€Π°Π½ΡŒΡˆΠ΅ использовали Flask, Ρ‚ΠΎ это Π°Π½Π°Π»ΠΎΠ³ шаблонов Flask (Flask's Blueprints). + +/// + +## ΠŸΡ€ΠΈΠΌΠ΅Ρ€ структуры прилоТСния + +Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру: + +``` +. +β”œβ”€β”€ app +β”‚Β Β  β”œβ”€β”€ __init__.py +β”‚Β Β  β”œβ”€β”€ main.py +β”‚Β Β  β”œβ”€β”€ dependencies.py +β”‚Β Β  └── routers +β”‚Β Β  β”‚ β”œβ”€β”€ __init__.py +β”‚Β Β  β”‚ β”œβ”€β”€ items.py +β”‚Β Β  β”‚ └── users.py +β”‚Β Β  └── internal +β”‚Β Β  β”œβ”€β”€ __init__.py +β”‚Β Β  └── admin.py +``` + +/// tip | Подсказка + +ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ имССтся Ρ„Π°ΠΉΠ» `__init__.py` + +Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. + +НапримСр, Π² Ρ„Π°ΠΉΠ»Π΅ `app/main.py` ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка: + +``` +from app.routers import items +``` + +/// + +* Всё помСщаСтся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `app`. Π’ Π½Ρ‘ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ находится пустой Ρ„Π°ΠΉΠ» `app/__init__.py`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, `app` являСтся "Python-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ" (ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Python). +* Он содСрТит Ρ„Π°ΠΉΠ» `app/main.py`. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (Ρ‚.Π΅. находится Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, содСрТащСго Ρ„Π°ΠΉΠ» `__init__.py`), ΠΈ, соотвСтствСнно, ΠΎΠ½ являСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°: `app.main`. +* Он Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Ρ„Π°ΠΉΠ» `app/dependencies.py`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ `app/main.py`, являСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: `app.dependencies`. +* Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ находится ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `app/routers/`, содСрТащий `__init__.py`. Он являСтся суб-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ: `app.routers`. +* Π€Π°ΠΉΠ» `app/routers/items.py` находится Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° `app/routers/`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ являСтся суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: `app.routers.items`. +* Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ `app/routers/users.py` являСтся Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: `app.routers.users`. +* ΠŸΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `app/internal/`, содСрТащий Ρ„Π°ΠΉΠ» `__init__.py`, являСтся Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ суб-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ: `app.internal`. +* А Ρ„Π°ΠΉΠ» `app/internal/admin.py` являСтся Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: `app.internal.admin`. + + + +Π’Π° ΠΆΠ΅ самая файловая структура прилоТСния, Π½ΠΎ с коммСнтариями: + +``` +. +β”œβ”€β”€ app # "app" ΠΏΠ°ΠΊΠ΅Ρ‚ +β”‚Β Β  β”œβ”€β”€ __init__.py # этот Ρ„Π°ΠΉΠ» ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "app" Π² "Python-ΠΏΠ°ΠΊΠ΅Ρ‚" +β”‚Β Β  β”œβ”€β”€ main.py # ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "main", Π½Π°ΠΏΡ€.: import app.main +β”‚Β Β  β”œβ”€β”€ dependencies.py # ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "dependencies", Π½Π°ΠΏΡ€.: import app.dependencies +β”‚Β Β  └── routers # суб-ΠΏΠ°ΠΊΠ΅Ρ‚ "routers" +β”‚Β Β  β”‚ β”œβ”€β”€ __init__.py # ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "routers" Π² суб-ΠΏΠ°ΠΊΠ΅Ρ‚ +β”‚Β Β  β”‚ β”œβ”€β”€ items.py # суб-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "items", Π½Π°ΠΏΡ€.: import app.routers.items +β”‚Β Β  β”‚ └── users.py # суб-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "users", Π½Π°ΠΏΡ€.: import app.routers.users +β”‚Β Β  └── internal # суб-ΠΏΠ°ΠΊΠ΅Ρ‚ "internal" +β”‚Β Β  β”œβ”€β”€ __init__.py # ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "internal" Π² суб-ΠΏΠ°ΠΊΠ΅Ρ‚ +β”‚Β Β  └── admin.py # суб-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ "admin", Π½Π°ΠΏΡ€.: import app.internal.admin +``` + +## `APIRouter` + +Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (суб-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ) `/app/routers/users.py`. + +Для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ, связанныС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ, ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. + +Но Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ **FastAPI** прилоТСния/Π²Π΅Π±-API (Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°) + +Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `APIRouter` Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ *ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ* (*эндпоинты*) для Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля. + + +### Π˜ΠΌΠΏΠΎΡ€Ρ‚ `APIRouter` + +Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² случаС с классом `FastAPI`, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса `APIRouter`. + +```Python hl_lines="1 3" title="app/routers/users.py" +{!../../docs_src/bigger_applications/app/routers/users.py!} +``` + +### Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ *эндпоинтов* с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `APIRouter` + +Π’ дальнСйшСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `APIRouter` для объявлСния *эндпоинтов*, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ класс `FastAPI`: + +```Python hl_lines="6 11 16" title="app/routers/users.py" +{!../../docs_src/bigger_applications/app/routers/users.py!} +``` + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± `APIRouter` ΠΊΠ°ΠΊ ΠΎΠ± "ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΠΎΠΉ вСрсии" класса FastAPI`. + +`APIRouter` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС Ρ‚Π΅ ΠΆΠ΅ самыС ΠΎΠΏΡ†ΠΈΠΈ. + +`APIRouter` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС Ρ‚Π΅ ΠΆΠ΅ самыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `parameters`, `responses`, `dependencies`, `tags`, ΠΈ Ρ‚. Π΄. + +/// tip | Подсказка + +Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π² качСствС названия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `router`, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя. + +/// + +ΠœΡ‹ собираСмся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ `APIRouter` ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ основному ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π° `FastAPI`, Π½ΠΎ сначала Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ зависимости ΠΈ создадим Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с `APIRouter`. + +## Зависимости + +Нам понадобятся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависимости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах нашСго прилоТСния. + +ΠœΡ‹ помСстим ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `dependencies` (`app/dependencies.py`). + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ простой Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ кастомизированный `X-Token` ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°: + +//// tab | Python 3.9+ + +```Python hl_lines="3 6-8" title="app/dependencies.py" +{!> ../../docs_src/bigger_applications/app_an_py39/dependencies.py!} +``` + +//// + +//// tab | Python 3.8+ + +```Python hl_lines="1 5-7" title="app/dependencies.py" +{!> ../../docs_src/bigger_applications/app_an/dependencies.py!} +``` + +//// + +//// tab | Python 3.8+ non-Annotated + +/// tip | Подсказка + +ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ `Annotated`, ΠΊΠΎΠ³Π΄Π° это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. + +/// + +```Python hl_lines="1 4-6" title="app/dependencies.py" +{!> ../../docs_src/bigger_applications/app/dependencies.py!} +``` + +//// + +/// tip | Подсказка + +Для простоты ΠΌΡ‹ воспользовались Π½Π΅ΠΊΠΈΠΌ Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊΠΎΠΌ. + +Π’ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… случаях для получСния Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ обСспСчСния бСзопасности [Security utilities](security/index.md){.internal-link target=_blank}. + +/// + +## Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с `APIRouter` + +Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ *эндпоинты*, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ "items", ΠΈ ΠΎΠ½ΠΈ находятся Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ `app/routers/items.py`. + +Π£ вас ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ *ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ* (*эндпоинты*): + +* `/items/` +* `/items/{item_id}` + +Π’ΡƒΡ‚ всё Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ситуации с `app/routers/users.py`. + +Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΌΠ½Π΅Π΅ ΠΈ слСгка ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. + +ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС *эндпоинты* Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ свойства: + +* ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ ΠΏΡƒΡ‚ΠΈ: `/items`. +* Π’Π΅Π³ΠΈ: (ΠΎΠ΄ΠΈΠ½ СдинствСнный Ρ‚Π΅Π³: `items`). +* Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ (responses) +* Зависимости: использованиС созданной Π½Π°ΠΌΠΈ зависимости `X-token` + +Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ всС эти свойства Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ *эндпоинта*, +ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΡ… Π² `APIRouter`. + +```Python hl_lines="5-10 16 21" title="app/routers/items.py" +{!../../docs_src/bigger_applications/app/routers/items.py!} +``` + +Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ *эндпоинт* начинаСтся с символа `/`: + +```Python hl_lines="1" +@router.get("/{item_id}") +async def read_item(item_id: str): + ... +``` + +...Ρ‚ΠΎ прСфикс Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ символом `/`. + +Π’ нашСм случаС прСфиксом являСтся `/items`. + +ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² наш ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ (router) список `Ρ‚Π΅Π³ΠΎΠ²` (`tags`) ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… `ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²` (`responses`), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ *эндпоинта*. + +И Π΅Ρ‰Ρ‘ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² наш ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ список `зависимостСй`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ *эндпоинтам*. + +/// tip | Подсказка + +ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² случаС с зависимостями Π² Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°Ρ… *эндпоинтов* ([dependencies in *path operation decorators*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния Π² *Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ эндпоинта* ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. + +/// + +Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ эндпоинты: + +* `/items/` +* `/items/{item_id}` + +...ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ. + +* Они Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Ρ‚Π΅Π³Π°ΠΌΠΈ ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка, Π² нашСм случаС это `"items"`. + * Π­Ρ‚ΠΈ Ρ‚Π΅Π³ΠΈ особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для систСмы автоматичСской ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (с использованиСм OpenAPI). +* ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ `responses`. +* ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ *эндпоинт* Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ список зависимостСй (`dependencies`), исполняСмых ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ *эндпоинта*. + * Если Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ зависимости Π² самой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ, **Ρ‚ΠΎ ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°**. + * Π‘Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ зависимости ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ зависимости, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π΅ *эндпоинта* ([`dependencies` in the decorator](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ парамСтричСскиС зависимости. + * Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ зависимости бСзопасности с областями видимости (`scopes`) [`Security` dependencies with `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + +/// tip | Подсказка + +НапримСр, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ зависимостСй Π² `APIRouter` ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ для доступа ΠΊΠΎ всСй Π³Ρ€ΡƒΠΏΠΏΠ΅ *эндпоинтов*, Π½Π΅ указывая зависимости для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ *эндпоинта*. + +/// + +/// check | Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° + +ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ `prefix`, `tags`, `responses` ΠΈ `dependencies` относятся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ **FastAPI**, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования ΠΊΠΎΠ΄Π°. + +/// + +### Π˜ΠΌΠΏΠΎΡ€Ρ‚ зависимостСй + +Наш ΠΊΠΎΠ΄ находится Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ `app.routers.items` (Ρ„Π°ΠΉΠ» `app/routers/items.py`). + +И Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ зависимости ΠΈΠ· модуля `app.dependencies` (Ρ„Π°ΠΉΠ» `app/dependencies.py`). + +ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° `..` для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° зависимости: + +```Python hl_lines="3" title="app/routers/items.py" +{!../../docs_src/bigger_applications/app/routers/items.py!} +``` + +#### Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚? + +/// tip | Подсказка + +Если Π²Ρ‹ прСкрасно Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π² Python, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»Ρƒ. + +/// + +Одна Ρ‚ΠΎΡ‡ΠΊΠ° `.`, ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: + +```Python +from .dependencies import get_token_header +``` +ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: + +* НачнитС с ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Ρ„Π°ΠΉΠ» `app/routers/items.py` располоТСн Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `app/routers/`)... +* ... Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `dependencies` (Ρ„Π°ΠΉΠ» `app/routers/dependencies.py`)... +* ... ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `get_token_header`. + +К соТалСнию, Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅ сущСствуСт, ΠΈ наши зависимости находятся Π² Ρ„Π°ΠΉΠ»Π΅ `app/dependencies.py`. + +ВспомнитС, ΠΊΠ°ΠΊ выглядит файловая структура нашСго прилоТСния: + + + +--- + +Π”Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ `..`, ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: + +```Python +from ..dependencies import get_token_header +``` + +ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚: + +* НачнитС с ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Ρ„Π°ΠΉΠ» `app/routers/items.py` находится Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `app/routers/`)... +* ... ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `app/`)... +* ... Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `dependencies` (Ρ„Π°ΠΉΠ» `app/dependencies.py`)... +* ... ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `get_token_header`. + +Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π΅Ρ€Π½ΠΎ! πŸŽ‰ + +--- + +Аналогично, Ссли Π±Ρ‹ ΠΌΡ‹ использовали Ρ‚Ρ€ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ `...`, ΠΊΠ°ΠΊ здСсь: + +```Python +from ...dependencies import get_token_header +``` + +Ρ‚ΠΎ это Π±Ρ‹ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ: + +* НачнитС с ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Ρ„Π°ΠΉΠ» `app/routers/items.py` находится Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `app/routers/`)... +* ... ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `app/`)... +* ... Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ сущСствуСт, `app` находится Π½Π° самом Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ 😱)... +* ... Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `dependencies` (Ρ„Π°ΠΉΠ» `app/dependencies.py`)... +* ... ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `get_token_header`. + +Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ, находящСмуся Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΡˆΠ΅ Ρ‡Π΅ΠΌ `app/` ΠΈ содСрТащСму свой собствСнный Ρ„Π°ΠΉΠ» `__init__.py`. Но Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρƒ нас Π½Π΅Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. 🚨 + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π² Python, ΠΈ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² своих собствСнных прилоТСниях любого уровня слоТности. πŸ€“ + +### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚Π΅Π³ΠΎΠ² (`tags`), ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (`responses`) ΠΈ зависимостСй (`dependencies`) + +ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ прСфикс `/items` ΠΈ список Ρ‚Π΅Π³ΠΎΠ² `tags=["items"]` для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ *эндпоинта*, Ρ‚.ΠΊ. ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΈΡ… Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `APIRouter`. + +Но ΠΏΠΎΠΌΠΈΠΌΠΎ этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ *эндпоинта*, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ (`responses`), Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ *эндпоинта*: + +```Python hl_lines="30-31" title="app/routers/items.py" +{!../../docs_src/bigger_applications/app/routers/items.py!} +``` + +/// tip | Подсказка + +ПослСдний *эндпоинт* Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ‚Π΅Π³ΠΎΠ²: `["items", "custom"]`. + +А Ρ‚Π°ΠΊΠΆΠ΅ Π² Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ ΠΎΠ±Π° ΠΎΡ‚Π²Π΅Ρ‚Π°: ΠΎΠ΄ΠΈΠ½ для `404` ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ для `403`. + +/// + +## ΠœΠΎΠ΄ΡƒΠ»ΡŒ main Π² `FastAPI` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `app/main.py`. + +ИмСнно сюда Π²Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ класс `FastAPI`. + +Π­Ρ‚ΠΎ основной Ρ„Π°ΠΉΠ» вашСго прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ всё Π² ΠΎΠ΄Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅. + +И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° большая Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΈ прилоТСния Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, основной Ρ„Π°ΠΉΠ» `app/main.py` Π±ΡƒΠ΄Π΅Ρ‚ достаточно простым. + +### Π˜ΠΌΠΏΠΎΡ€Ρ‚ `FastAPI` + +Π’Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ создаСтС класс `FastAPI` ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. + +ΠœΡ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ зависимости [global dependencies](dependencies/global-dependencies.md){.internal-link target=_blank}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ с зависимостями для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: + +```Python hl_lines="1 3 7" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +### Π˜ΠΌΠΏΠΎΡ€Ρ‚ `APIRouter` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ суб-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, содСрТащиС `APIRouter`: + +```Python hl_lines="4-5" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ `app/routers/users.py` ΠΈ `app/routers/items.py` ΡΠ²Π»ΡΡŽΡ‚ΡΡ суб-модулями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Python-ΠΏΠ°ΠΊΠ΅Ρ‚Π° `app`, Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΠΈΡ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, воспользовавшись ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° `.`. + +### Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚? + +Данная строка ΠΊΠΎΠ΄Π°: + +```Python +from .routers import items, users +``` + +ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: + +* НачнитС с ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Ρ„Π°ΠΉΠ» `app/main.py` содСрТится Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `app/`)... +* ... Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ суб-ΠΏΠ°ΠΊΠ΅Ρ‚ `routers` (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `app/routers/`)... +* ... ΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ суб-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ `items` (Ρ„Π°ΠΉΠ» `app/routers/items.py`) ΠΈ `users` (Ρ„Π°ΠΉΠ» `app/routers/users.py`)... + +Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ `items` содСрТится пСрСмСнная `router` (`items.router`), Ρ‚Π° самая, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ создали Π² Ρ„Π°ΠΉΠ»Π΅ `app/routers/items.py`, ΠΎΠ½Π° являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса `APIRouter`. + +И Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ сдСлаСм Ρ‚ΠΎ ΠΆΠ΅ самоС для модуля `users`. + +ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ: + +```Python +from app.routers import items, users +``` + +/// info | ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ + +ΠŸΠ΅Ρ€Π²Π°Ρ вСрсия являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°: + +```Python +from .routers import items, users +``` + +Вторая вСрсия являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°: + +```Python +from app.routers import items, users +``` + +Π£Π·Π½Π°Ρ‚ΡŒ большС ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… ΠΈ модулях Π² Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python ΠΎ модулях + +/// + +### Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½ + +ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `router`, ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ нСпосрСдствСнно суб-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `items`. + +ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Π° пСрСмСнная `router` Π² суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ `users`. + +Если Π±Ρ‹ ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΈΡ… ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: + +```Python +from .routers.items import router +from .routers.users import router +``` + +Ρ‚ΠΎ пСрСмСнная `router` ΠΈΠ· `users` пСрСписал Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `router` ΠΈΠ· `items`, ΠΈ Ρƒ нас Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ возмоТности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. + +ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ суб-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ: + +```Python hl_lines="5" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +### ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (`APIRouter`) для `users` ΠΈ для `items` + +Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ (`router`) ΠΈΠ· суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ `users` ΠΈ `items`: + +```Python hl_lines="10-11" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +/// info | ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ + +`users.router` содСрТит `APIRouter` ΠΈΠ· Ρ„Π°ΠΉΠ»Π° `app/routers/users.py`. + +А `items.router` содСрТит `APIRouter` ΠΈΠ· Ρ„Π°ΠΉΠ»Π° `app/routers/items.py`. + +/// + +Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `app.include_router()` ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (`APIRouter`) Π² основноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ `FastAPI`. + +Он ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ всС ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ. + +/// note | ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ + +ЀактичСски, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ½ создаст всС *ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ* для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ объявлСнной Π² `APIRouter`. + +И ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ всё Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с ΠΎΠ΄Π½ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ прилоТСния. + +/// + +/// check | Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° + +ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ стоит Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. + +ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°ΠΉΠΌΡ‘Ρ‚ микросСкунды ΠΈ понадобится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ запускС прилоТСния. + +Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это Π½Π΅ повлияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ⚑ + +/// + +### ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ `APIRouter` с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ прСфиксом (`prefix`), Ρ‚Π΅Π³Π°ΠΌΠΈ (`tags`), ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ (`responses`), ΠΈ зависимостями (`dependencies`) + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ ваша организация ΠΏΠ΅Ρ€Π΅Π΄Π°Π»Π° Π²Π°ΠΌ Ρ„Π°ΠΉΠ» `app/internal/admin.py`. + +Он содСрТит `APIRouter` с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ *эндпоитами* администрирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ваша организация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². + +Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ просто. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², +Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, добавляя прСфиксы (`prefix`), зависимости (`dependencies`), Ρ‚Π΅Π³ΠΈ (`tags`), ΠΈ Ρ‚.Π΄. нСпосрСдствСнно Π² `APIRouter`: + +```Python hl_lines="3" title="app/internal/admin.py" +{!../../docs_src/bigger_applications/app/internal/admin.py!} +``` + +Но, нСсмотря Π½Π° это, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ кастомный прСфикс (`prefix`) для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (`APIRouter`), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ, каТдая *опСрация ΠΏΡƒΡ‚ΠΈ* Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с `/admin`. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ наш ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ зависимостСй, созданных для нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. И Π΅Ρ‰Ρ‘ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π³ΠΈ (`tags`) ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ (`responses`). + +ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ настройки, Π½Π΅ измСняя Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ `APIRouter`. Нам всСго лишь Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² `app.include_router()`. + +```Python hl_lines="14-17" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ `APIRouter` Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ ΠΌΡ‹ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» `app/internal/admin.py` сразу Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. + +Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ *эндпоинт* модуля `admin` Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ: + +* ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ `/admin`. +* Π’Π΅Π³ `admin`. +* Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ `get_token_header`. +* ΠžΡ‚Π²Π΅Ρ‚ `418`. 🍡 + +Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ мСсто ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для `APIRouter` Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈ Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅Ρ‚ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ. + +НапримСр, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый `APIRouter` с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. + +### ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ *эндпоинта* + +ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ *эндпоинт* нСпосрСдствСнно Π² основноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ `FastAPI`. + +Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ это Π΄Π΅Π»Π°Π΅ΠΌ ... просто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ 🀷: + +```Python hl_lines="21-23" title="app/main.py" +{!../../docs_src/bigger_applications/app/main.py!} +``` + +ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ *эндпоинтами*, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `app.include_router()`. + +/// info | Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ тСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ + +**ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅**: это слоТная тСхничСская Π΄Π΅Ρ‚Π°Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ, скорСС всСго, **Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ**. + +--- + +ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ (`APIRouter`) Π½Π΅ "ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ" ΠΏΠΎ-ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π½Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния. + +Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… *эндпоинты* Π² OpenAPI схСму ΠΈ Π² интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. + +Π’ силу Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ… ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ "ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ" нСзависимо ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…, *эндпоинты* ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ (ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ) ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. + +/// + +## ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° автоматичСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: + +
+ +```console +$ fastapi dev app/main.py + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ адрСсу http://127.0.0.1:8000/docs. + +Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ API Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ. Она Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΈΠ· суб-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹, прСфиксы ΠΈ Ρ‚Π΅Π³ΠΈ: + + + +## ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· Π½ΠΎΠ²Ρ‹ΠΉ прСфикс (`prefix`) + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `.include_router()` нСсколько Ρ€Π°Π· с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ прСфиксы. + +Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ API Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ прСфиксы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `/api/v1` ΠΈ `/api/latest`. + +Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ пригодится. ΠœΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π½Π° случай, Ссли Π²Π΄Ρ€ΡƒΠ³ Π²Π°ΠΌ это понадобится. + +## Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (`APIRouter`) Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ + +Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ `APIRouter` Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ `FastAPI`, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ `APIRouter` Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ `APIRouter`: + +```Python +router.include_router(other_router) +``` + +Π£Π΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ сдСлали это Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ (`router`) ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ `FastAPI` ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΈ *эндпоинты* ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° `other_router` Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹. diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 823957822..c92279cfd 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.115.6" +__version__ = "0.115.7" from starlette import status as status diff --git a/pyproject.toml b/pyproject.toml index edfa81522..381eb50bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ classifiers = [ "Framework :: FastAPI", "Framework :: Pydantic", "Framework :: Pydantic :: 1", + "Framework :: Pydantic :: 2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3 :: Only", @@ -41,7 +42,7 @@ classifiers = [ "Topic :: Internet :: WWW/HTTP", ] dependencies = [ - "starlette>=0.40.0,<0.42.0", + "starlette>=0.40.0,<0.46.0", "pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0", "typing-extensions>=4.8.0", ] @@ -60,9 +61,9 @@ standard = [ # For the test client "httpx >=0.23.0", # For templates - "jinja2 >=2.11.2", + "jinja2 >=3.1.5", # For forms and file uploads - "python-multipart >=0.0.7", + "python-multipart >=0.0.18", # To validate email fields "email-validator >=2.0.0", # Uvicorn with uvloop @@ -79,9 +80,9 @@ all = [ # # For the test client "httpx >=0.23.0", # For templates - "jinja2 >=2.11.2", + "jinja2 >=3.1.5", # For forms and file uploads - "python-multipart >=0.0.7", + "python-multipart >=0.0.18", # For Starlette's SessionMiddleware, not commonly used with FastAPI "itsdangerous >=1.1.0", # For Starlette's schema generation, would not be used with FastAPI