]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Update translations for ru (update-outdated) (#14693)
authorSebastián Ramírez <tiangolo@gmail.com>
Tue, 20 Jan 2026 23:03:07 +0000 (15:03 -0800)
committerGitHub <noreply@github.com>
Tue, 20 Jan 2026 23:03:07 +0000 (00:03 +0100)
* 🌐 Update translations for ru (update-outdated)

* 🎨 Auto format

* Apply suggestions from code review

* Apply suggestions from code review 2

* Apply suggestions from code review 3

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
13 files changed:
docs/ru/docs/_llm-test.md
docs/ru/docs/advanced/path-operation-advanced-configuration.md
docs/ru/docs/advanced/settings.md
docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
docs/ru/docs/how-to/separate-openapi-schemas.md
docs/ru/docs/index.md
docs/ru/docs/tutorial/bigger-applications.md
docs/ru/docs/tutorial/body-updates.md
docs/ru/docs/tutorial/body.md
docs/ru/docs/tutorial/extra-models.md
docs/ru/docs/tutorial/query-params-str-validations.md
docs/ru/docs/tutorial/response-model.md
docs/ru/docs/tutorial/schema-extra-example.md

index 9a15f6bb21a2d49946455eab1255c87628da85aa..6a0272f3a5c84ab2b4f064d0745db62fef48523c 100644 (file)
@@ -1,8 +1,8 @@
 # Тестовый файл LLM { #llm-test-file }
 
-Этот документ проверяет, понимает ли <abbr title="Large Language Model  Большая языковая модель">LLM</abbr>, переводящая документацию, `general_prompt` в `scripts/translate.py` и языковой специфичный промпт в `docs/{language code}/llm-prompt.md`. Языковой специфичный промпт добавляется к `general_prompt`.
+Этот документ проверяет, понимает ли <abbr title="Large Language Model - Большая языковая модель">LLM</abbr>, переводящая документацию, `general_prompt` в `scripts/translate.py` и языковой специфичный промпт в `docs/{language code}/llm-prompt.md`. Языковой специфичный промпт добавляется к `general_prompt`.
 
-Тесты, добавленные здесь, увидят все создатели языковых промптов.
+Тесты, добавленные здесь, увидят все создатели языковых специфичных промптов.
 
 Использование:
 
@@ -11,7 +11,7 @@
 * Проверьте, всё ли в порядке в переводе.
 * При необходимости улучшите ваш языковой специфичный промпт, общий промпт или английский документ.
 * Затем вручную исправьте оставшиеся проблемы в переводе, чтобы он был хорошим.
-* Ð\9fеÑ\80еведиÑ\82е Ð·Ð°Ð½Ð¾Ð²Ð¾, Ð¸Ð¼ÐµÑ\8f Ñ\85оÑ\80оÑ\88ий Ð¿ÐµÑ\80евод Ð½Ð° Ð¼ÐµÑ\81Ñ\82е. Ð\98деалÑ\8cнÑ\8bм Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ом Ð±Ñ\83деÑ\82 Ñ\81иÑ\82Ñ\83аÑ\86иÑ\8f, ÐºÐ¾Ð³Ð´Ð° LLM Ð±Ð¾Ð»Ñ\8cÑ\88е Ð½Ðµ Ð²Ð½Ð¾Ñ\81иÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ð¿ÐµÑ\80евод. Ð­Ñ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о Ð¾Ð±Ñ\89ий Ð¿Ñ\80омпÑ\82 Ð¸ Ð²Ð°Ñ\88 Ñ\8fзÑ\8bковой Ñ\81пеÑ\86иÑ\84иÑ\87нÑ\8bй Ð¿Ñ\80омпÑ\82 Ð¼Ð°ÐºÑ\81ималÑ\8cно Ñ\85оÑ\80оÑ\88и (иногда он будет делать несколько, казалось бы, случайных изменений, причина в том, что <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM — недетерминированные алгоритмы</a>).
+* Ð\9fеÑ\80еведиÑ\82е Ð·Ð°Ð½Ð¾Ð²Ð¾, Ð¸Ð¼ÐµÑ\8f Ñ\85оÑ\80оÑ\88ий Ð¿ÐµÑ\80евод Ð½Ð° Ð¼ÐµÑ\81Ñ\82е. Ð\98деалÑ\8cнÑ\8bм Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ом Ð±Ñ\83деÑ\82 Ñ\81иÑ\82Ñ\83аÑ\86иÑ\8f, ÐºÐ¾Ð³Ð´Ð° LLM Ð±Ð¾Ð»Ñ\8cÑ\88е Ð½Ðµ Ð²Ð½Ð¾Ñ\81иÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ð¿ÐµÑ\80евод. Ð­Ñ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о Ð¾Ð±Ñ\89ий Ð¿Ñ\80омпÑ\82 Ð¸ Ð²Ð°Ñ\88 Ñ\8fзÑ\8bковой Ñ\81пеÑ\86иÑ\84иÑ\87нÑ\8bй Ð¿Ñ\80омпÑ\82 Ð½Ð°Ñ\81Ñ\82олÑ\8cко Ñ\85оÑ\80оÑ\88и, Ð½Ð°Ñ\81колÑ\8cко Ñ\8dÑ\82о Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ (иногда он будет делать несколько, казалось бы, случайных изменений, причина в том, что <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM — недетерминированные алгоритмы</a>).
 
 Тесты:
 
@@ -197,10 +197,10 @@ works(foo="bar")  # Это работает 🎉
 
 ### abbr даёт полную расшифровку { #the-abbr-gives-a-full-phrase }
 
-* <abbr title="Getting Things Done  Как привести дела в порядок">GTD</abbr>
-* <abbr title="less than  меньше чем"><code>lt</code></abbr>
-* <abbr title="XML Web Token  XML веб‑токен">XWT</abbr>
-* <abbr title="Parallel Server Gateway Interface  Параллельный серверный интерфейс шлюза">PSGI</abbr>
+* <abbr title="Getting Things Done - Как привести дела в порядок">GTD</abbr>
+* <abbr title="less than - меньше чем"><code>lt</code></abbr>
+* <abbr title="XML Web Token - XML веб‑токен">XWT</abbr>
+* <abbr title="Parallel Server Gateway Interface - Параллельный серверный интерфейс шлюза">PSGI</abbr>
 
 ### abbr даёт объяснение { #the-abbr-gives-an-explanation }
 
@@ -209,8 +209,8 @@ works(foo="bar")  # Это работает 🎉
 
 ### abbr даёт полную расшифровку и объяснение { #the-abbr-gives-a-full-phrase-and-an-explanation }
 
-* <abbr title="Mozilla Developer Network  Сеть разработчиков Mozilla: документация для разработчиков, созданная командой Firefox">MDN</abbr>
-* <abbr title="Input/Output  Ввод/Вывод: чтение или запись на диск, сетевое взаимодействие.">I/O</abbr>.
+* <abbr title="Mozilla Developer Network - Сеть разработчиков Mozilla: документация для разработчиков, созданная командой Firefox">MDN</abbr>
+* <abbr title="Input/Output - Ввод/Вывод: чтение или запись на диск, сетевое взаимодействие.">I/O</abbr>.
 
 ////
 
index eaf9ad0528785812c25943051cc8bdea15191999..86d3a5b630da0998d5814f81faaf7a01fd03998b 100644 (file)
@@ -14,7 +14,7 @@
 
 {* ../../docs_src/path_operation_advanced_configuration/tutorial001_py39.py hl[6] *}
 
-### Использование имени функции-обработчика пути как operationId { #using-the-path-operation-function-name-as-the-operationid }
+### Использование имени *функции-обработчика пути* как operationId { #using-the-path-operation-function-name-as-the-operationid }
 
 Если вы хотите использовать имена функций ваших API в качестве `operationId`, вы можете пройти по всем из них и переопределить `operation_id` каждой *операции пути* с помощью их `APIRoute.name`.
 
@@ -38,7 +38,7 @@
 
 ## Исключить из OpenAPI { #exclude-from-openapi }
 
-ЧÑ\82обÑ\8b Ð¸Ñ\81клÑ\8eÑ\87иÑ\82Ñ\8c *опеÑ\80аÑ\86иÑ\8e Ð¿Ñ\83Ñ\82и* Ð¸Ð· Ð³ÐµÐ½ÐµÑ\80иÑ\80Ñ\83емой Ñ\81Ñ\85емÑ\8b OpenAPI (а Ð·Ð½Ð°Ñ\87иÑ\82, Ð¸ Ð¸Ð· Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81кой документации), используйте параметр `include_in_schema` и установите его в `False`:
+ЧÑ\82обÑ\8b Ð¸Ñ\81клÑ\8eÑ\87иÑ\82Ñ\8c *опеÑ\80аÑ\86иÑ\8e Ð¿Ñ\83Ñ\82и* Ð¸Ð· Ð³ÐµÐ½ÐµÑ\80иÑ\80Ñ\83емой Ñ\81Ñ\85емÑ\8b OpenAPI (а Ð·Ð½Ð°Ñ\87иÑ\82, Ð¸ Ð¸Ð· Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81киÑ\85 Ñ\81иÑ\81Ñ\82ем документации), используйте параметр `include_in_schema` и установите его в `False`:
 
 {* ../../docs_src/path_operation_advanced_configuration/tutorial003_py39.py hl[6] *}
 
@@ -48,7 +48,7 @@
 
 Добавление `\f` (экранированного символа «form feed») заставит **FastAPI** обрезать текст, используемый для OpenAPI, в этой точке.
 
-ЭÑ\82а Ñ\87аÑ\81Ñ\82Ñ\8c Ð½Ðµ Ð¿Ð¾Ð¿Ð°Ð´Ñ\91Ñ\82 Ð² Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\8e, но другие инструменты (например, Sphinx) смогут использовать остальное.
+ЭÑ\82о Ð½Ðµ Ð¾Ñ\82обÑ\80азиÑ\82Ñ\81Ñ\8f Ð² Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86ии, но другие инструменты (например, Sphinx) смогут использовать остальное.
 
 {* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *}
 
@@ -56,7 +56,7 @@
 
 Вы, вероятно, уже видели, как объявлять `response_model` и `status_code` для *операции пути*.
 
-Это определяет метаданные об основном ответе *операции пути*.
+Это определяет метаданные об основном HTTP-ответе *операции пути*.
 
 Также можно объявлять дополнительные ответы с их моделями, статус-кодами и т.д.
 
@@ -76,7 +76,7 @@
 
 Там есть `tags`, `parameters`, `requestBody`, `responses` и т.д.
 
-Эта спецификация OpenAPI, специфичная для *операции пути*, обычно генерируется автоматически **FastAPI**, но вы также можете её расширить.
+Эта специфичная для *операции пути* схема OpenAPI обычно генерируется автоматически **FastAPI**, но вы также можете её расширить.
 
 /// tip | Совет
 
 }
 ```
 
-### Пользовательская схема OpenAPI для операции пути { #custom-openapi-path-operation-schema }
+### Пользовательская схема OpenAPI для *операции пути* { #custom-openapi-path-operation-schema }
 
-Словарь в `openapi_extra` будет объединён с автоматически сгенерированной схемой OpenAPI для *операции пути*.
+СловаÑ\80Ñ\8c Ð² `openapi_extra` Ð±Ñ\83деÑ\82 Ð³Ð»Ñ\83боко Ð¾Ð±Ñ\8aединÑ\91н Ñ\81 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ñ\81генеÑ\80иÑ\80ованной Ñ\81Ñ\85емой OpenAPI Ð´Ð»Ñ\8f *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и*.
 
 Таким образом, вы можете добавить дополнительные данные к автоматически сгенерированной схеме.
 
-Например, вы можете решить читать и валидировать запрос своим кодом, не используя автоматические возможности FastAPI и Pydantic, но при этом захотите описать запрос в схеме OpenAPI.
+Например, вы можете решить читать и валидировать HTTP-запрос своим кодом, не используя автоматические возможности FastAPI и Pydantic, но при этом захотите описать HTTP-запрос в схеме OpenAPI.
 
 Это можно сделать с помощью `openapi_extra`:
 
 
 Используя тот же приём, вы можете воспользоваться Pydantic-моделью, чтобы определить JSON Schema, которая затем будет включена в пользовательский раздел схемы OpenAPI для *операции пути*.
 
-И вы можете сделать это, даже если тип данных в запросе — не JSON.
+И вы можете сделать это, даже если тип данных в HTTP-запросе — не JSON.
 
-Например, в этом приложении мы не используем встроенную функциональность FastAPI для извлечения JSON Schema из моделей Pydantic, равно как и автоматическую валидацию JSON. Мы объявляем тип содержимого запроса как YAML, а не JSON:
-
-//// tab | Pydantic v2
+Например, в этом приложении мы не используем встроенную функциональность FastAPI для извлечения JSON Schema из моделей Pydantic, равно как и автоматическую валидацию JSON. Мы объявляем тип содержимого HTTP-запроса как YAML, а не JSON:
 
 {* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[15:20, 22] *}
 
-////
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1_py39.py hl[15:20, 22] *}
-
-////
-
-/// info | Информация
-
-В Pydantic версии 1 метод для получения JSON Schema модели назывался `Item.schema()`, в Pydantic версии 2 метод называется `Item.model_json_schema()`.
-
-///
-
 Тем не менее, хотя мы не используем встроенную функциональность по умолчанию, мы всё равно используем Pydantic-модель, чтобы вручную сгенерировать JSON Schema для данных, которые мы хотим получить в YAML.
 
-Затем мы работаем с запросом напрямую и извлекаем тело как `bytes`. Это означает, что FastAPI даже не попытается распарсить полезную нагрузку запроса как JSON.
+Затем мы работаем с HTTP-запросом напрямую и извлекаем тело как `bytes`. Это означает, что FastAPI даже не попытается распарсить полезную нагрузку HTTP-запроса как JSON.
 
-А затем в нашем коде мы напрямую парсим этот YAML и снова используем ту же Pydantic-модель для валидации YAML-содержимого:
-
-//// tab | Pydantic v2
+А затем в нашем коде мы напрямую парсим это содержимое YAML и снова используем ту же Pydantic-модель, чтобы валидировать YAML-содержимое:
 
 {* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[24:31] *}
 
-////
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1_py39.py hl[24:31] *}
-
-////
-
-/// info | Информация
-
-В Pydantic версии 1 метод для парсинга и валидации объекта назывался `Item.parse_obj()`, в Pydantic версии 2 метод называется `Item.model_validate()`.
-
-///
-
 /// tip | Совет
 
 Здесь мы переиспользуем ту же Pydantic-модель.
index b96ee44a3a1b63b661284b6b17644ce4aa1b7e19..8408faebff981833faa9321a082b37ed8e61672a 100644 (file)
@@ -46,12 +46,6 @@ $ pip install "fastapi[all]"
 
 </div>
 
-/// info | Информация
-
-В Pydantic v1 он входил в основной пакет. Теперь он распространяется как отдельный пакет, чтобы вы могли установить его только при необходимости.
-
-///
-
 ### Создание объекта `Settings` { #create-the-settings-object }
 
 Импортируйте `BaseSettings` из Pydantic и создайте подкласс, очень похожий на Pydantic‑модель.
@@ -60,24 +54,8 @@ $ pip install "fastapi[all]"
 
 Вы можете использовать все те же возможности валидации и инструменты, что и для Pydantic‑моделей, например разные типы данных и дополнительную валидацию через `Field()`.
 
-//// tab | Pydantic v2
-
 {* ../../docs_src/settings/tutorial001_py39.py hl[2,5:8,11] *}
 
-////
-
-//// tab | Pydantic v1
-
-/// info | Информация
-
-В Pydantic v1 вы бы импортировали `BaseSettings` напрямую из `pydantic`, а не из `pydantic_settings`.
-
-///
-
-{* ../../docs_src/settings/tutorial001_pv1_py39.py hl[2,5:8,11] *}
-
-////
-
 /// tip | Совет
 
 Если вам нужно что-то быстро скопировать и вставить, не используйте этот пример — воспользуйтесь последним ниже.
@@ -215,8 +193,6 @@ APP_NAME="ChimichangApp"
 
 Затем обновите ваш `config.py` так:
 
-//// tab | Pydantic v2
-
 {* ../../docs_src/settings/app03_an_py39/config.py hl[9] *}
 
 /// tip | Совет
@@ -225,26 +201,6 @@ APP_NAME="ChimichangApp"
 
 ///
 
-////
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/settings/app03_an_py39/config_pv1.py hl[9:10] *}
-
-/// tip | Совет
-
-Класс `Config` используется только для конфигурации Pydantic. Подробнее см. <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>.
-
-///
-
-////
-
-/// info | Информация
-
-В Pydantic версии 1 конфигурация задавалась во внутреннем классе `Config`, в Pydantic версии 2 — в атрибуте `model_config`. Этот атрибут принимает `dict`, и чтобы получить автозавершение и ошибки «на лету», вы можете импортировать и использовать `SettingsConfigDict` для описания этого `dict`.
-
-///
-
 Здесь мы задаем параметр конфигурации `env_file` внутри вашего класса Pydantic `Settings` и устанавливаем значение равным имени файла dotenv, который хотим использовать.
 
 ### Создание `Settings` только один раз с помощью `lru_cache` { #creating-the-settings-only-once-with-lru-cache }
index 95481bc6680551487e33698db3f399d9c79f258a..2b47c08f67f02cccb6affcdd1b837b1d83106793 100644 (file)
@@ -2,21 +2,23 @@
 
 Если у вас старое приложение FastAPI, возможно, вы используете Pydantic версии 1.
 
-FastAPI Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¸ Pydantic v1, Ð¸ v2 Ð½Ð°Ñ\87инаÑ\8f Ñ\81 Ð²ÐµÑ\80Ñ\81ии 0.100.0.
+FastAPI Ð²ÐµÑ\80Ñ\81ии 0.100.0 Ð¿Ð¾Ð´Ð´ÐµÑ\80живал Ð»Ð¸Ð±Ð¾ Pydantic v1, Ð»Ð¸Ð±Ð¾ v2. Ð\9eн Ð¸Ñ\81полÑ\8cзовал Ñ\82Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8e, ÐºÐ¾Ñ\82оÑ\80аÑ\8f Ð±Ñ\8bла Ñ\83Ñ\81Ñ\82ановлена.
 
-Если у вас был установлен Pydantic v2, использовался он. Если вместо этого был установлен Pydantic v1 — использовался он.
+FastAPI версии 0.119.0 добавил частичную поддержку Pydantic v1 изнутри Pydantic v2 (как `pydantic.v1`), чтобы упростить миграцию на v2.
 
-Сейчас Pydantic v1 объявлен устаревшим, и поддержка его будет удалена в следующих версиях FastAPI, поэтому вам следует **перейти на Pydantic v2**. Так вы получите последние возможности, улучшения и исправления.
+FastAPI 0.126.0 убрал поддержку Pydantic v1, при этом ещё некоторое время продолжал поддерживать `pydantic.v1`.
 
 /// warning | Предупреждение
 
-Кроме того, команда Pydantic прекратила поддержку Pydantic v1 для последних версий Python, начиная с **Python 3.14**.
+Команда Pydantic прекратила поддержку Pydantic v1 для последних версий Python, начиная с **Python 3.14**.
+
+Это включает `pydantic.v1`, который больше не поддерживается в Python 3.14 и выше.
 
 Если вы хотите использовать последние возможности Python, вам нужно убедиться, что вы используете Pydantic v2.
 
 ///
 
\95Ñ\81ли Ñ\83 Ð²Ð°Ñ\81 Ñ\81Ñ\82аÑ\80ое Ð¿Ñ\80иложение FastAPI Ñ\81 Pydantic v1, Ð·Ð´ÐµÑ\81Ñ\8c Ñ\8f Ð¿Ð¾ÐºÐ°Ð¶Ñ\83, ÐºÐ°Ðº Ð¼Ð¸Ð³Ñ\80иÑ\80оваÑ\82Ñ\8c Ð½Ð° Pydantic v2, Ð¸ **новÑ\8bе Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82и Ð² FastAPI 0.119.0**, которые помогут выполнить постепенную миграцию.
\95Ñ\81ли Ñ\83 Ð²Ð°Ñ\81 Ñ\81Ñ\82аÑ\80ое Ð¿Ñ\80иложение FastAPI Ñ\81 Pydantic v1, Ð·Ð´ÐµÑ\81Ñ\8c Ñ\8f Ð¿Ð¾ÐºÐ°Ð¶Ñ\83, ÐºÐ°Ðº Ð¼Ð¸Ð³Ñ\80иÑ\80оваÑ\82Ñ\8c Ð½Ð° Pydantic v2, Ð¸ **возможноÑ\81Ñ\82и FastAPI 0.119.0**, которые помогут выполнить постепенную миграцию.
 
 ## Официальное руководство { #official-guide }
 
@@ -38,13 +40,13 @@ FastAPI поддерживает и Pydantic v1, и v2 начиная с вер
 
 Вы можете использовать <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> от той же команды Pydantic.
 
-ЭÑ\82оÑ\82 Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82 Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ\82 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð²Ð½ÐµÑ\81Ñ\82и Ð±Ð¾Ð»Ñ\8cÑ\88Ñ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¾Ð±Ñ\85одимÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² ÐºÐ¾Ð´.
+ЭÑ\82оÑ\82 Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82 Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ\82 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88Ñ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c ÐºÐ¾Ð´Ð°, ÐºÐ¾Ñ\82оÑ\80Ñ\8bй Ð½Ñ\83жно Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c.
 
\9fоÑ\81ле Ñ\8dÑ\82ого Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Ñ\82еÑ\81Ñ\82Ñ\8b Ð¸ Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е, что всё работает. Если да — на этом всё. 😎
\9fоÑ\81ле Ñ\8dÑ\82ого Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\82еÑ\81Ñ\82Ñ\8b Ð¸ Ð¿Ñ\80овеÑ\80иÑ\82Ñ\8c, что всё работает. Если да — на этом всё. 😎
 
 ## Pydantic v1 в v2 { #pydantic-v1-in-v2 }
 
-Pydantic v2 включает всё из Pydantic v1 как подмодуль `pydantic.v1`.
+Pydantic v2 включает всё из Pydantic v1 как подмодуль `pydantic.v1`. Но это больше не поддерживается в версиях Python выше 3.13.
 
 Это означает, что вы можете установить последнюю версию Pydantic v2 и импортировать и использовать старые компоненты Pydantic v1 из этого подмодуля так, как если бы у вас был установлен старый Pydantic v1.
 
@@ -52,7 +54,7 @@ Pydantic v2 включает всё из Pydantic v1 как подмодуль `
 
 ### Поддержка FastAPI для Pydantic v1 внутри v2 { #fastapi-support-for-pydantic-v1-in-v2 }
 
\9dаÑ\87инаÑ\8f Ñ\81 FastAPI 0.119.0, ÐµÑ\81Ñ\82Ñ\8c Ñ\82акже Ñ\87аÑ\81Ñ\82иÑ\87наÑ\8f Ð¿Ð¾Ð´Ð´ÐµÑ\80жка Pydantic v1 Ð² Ñ\81оÑ\81Ñ\82аве Pydantic v2, чтобы упростить миграцию на v2.
\9dаÑ\87инаÑ\8f Ñ\81 FastAPI 0.119.0, ÐµÑ\81Ñ\82Ñ\8c Ñ\82акже Ñ\87аÑ\81Ñ\82иÑ\87наÑ\8f Ð¿Ð¾Ð´Ð´ÐµÑ\80жка Pydantic v1 Ð¸Ð·Ð½Ñ\83Ñ\82Ñ\80и Pydantic v2, чтобы упростить миграцию на v2.
 
 Таким образом, вы можете обновить Pydantic до последней версии 2 и сменить импорты на подмодуль `pydantic.v1` — во многих случаях всё просто заработает.
 
@@ -106,7 +108,7 @@ graph TB
     style V2Field fill:#f9fff3
 ```
 
-В некоторых случаях можно использовать и модели Pydantic v1, и v2 в одной и той же операции пути (обработчике пути) вашего приложения FastAPI:
+В некоторых случаях можно использовать и модели Pydantic v1, и v2 в одной и той же **операции пути** (обработчике пути) вашего приложения FastAPI:
 
 {* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}
 
@@ -122,12 +124,12 @@ graph TB
 
 /// tip | Совет
 
-Сначала попробуйте `bump-pydantic`. Если тесты проходят и всё работает, вы справились одной командой. ✨
+Сначала попробуйте `bump-pydantic`: если тесты проходят и всё работает, вы справились одной командой. ✨
 
 ///
 
 Если `bump-pydantic` не подходит для вашего случая, вы можете использовать поддержку одновременной работы моделей Pydantic v1 и v2 в одном приложении, чтобы мигрировать на Pydantic v2 постепенно.
 
-СнаÑ\87ала Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82е Pydantic Ð´Ð¾ Ð¿Ð¾Ñ\81ледней 2-й Ð²ÐµÑ\80Ñ\81ии Ð¸ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82е импорты так, чтобы все ваши модели использовали `pydantic.v1`.
+СнаÑ\87ала Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Pydantic Ð´Ð¾ Ð¿Ð¾Ñ\81ледней 2-й Ð²ÐµÑ\80Ñ\81ии Ð¸ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c импорты так, чтобы все ваши модели использовали `pydantic.v1`.
 
\97аÑ\82ем Ð½Ð°Ñ\87ниÑ\82е мигрировать ваши модели с Pydantic v1 на v2 группами, поэтапно. 🚶
\97аÑ\82ем Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ñ\87аÑ\82Ñ\8c мигрировать ваши модели с Pydantic v1 на v2 группами, поэтапно. 🚶
index 5b12140167ba85690d852884e5f4e0f589768205..8f6c83e7ec270bc9a1b40e0e480aa9328159a2ce 100644 (file)
@@ -2,7 +2,7 @@
 
 При использовании **Pydantic v2** сгенерированный OpenAPI становится чуть более точным и **корректным**, чем раньше. 😎
 
-На самом деле, в некоторых случаях в OpenAPI будет даже **две JSON схемы** для одной и той же Pydantic‑модели: для входа и для выхода — в зависимости от наличия **значений по умолчанию**.
+На самом деле, в некоторых случаях в OpenAPI будет даже **две JSON-схемы** для одной и той же Pydantic‑модели: для входа и для выхода — в зависимости от наличия **значений по умолчанию**.
 
 Посмотрим, как это работает, и как это изменить при необходимости.
 
@@ -34,7 +34,7 @@
 
 {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
 
\80¦Ñ\82о, Ð¿Ð¾Ñ\81колÑ\8cкÑ\83 Ñ\83 `description` ÐµÑ\81Ñ\82Ñ\8c Ð·Ð½Ð°Ñ\87ение Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e, Ð´Ð°Ð¶Ðµ ÐµÑ\81ли Ð²Ñ\8b **ниÑ\87его Ð½Ðµ Ð²ÐµÑ\80нÑ\91Ñ\82е** Ð´Ð»Ñ\8f Ñ\8dÑ\82ого Ð¿Ð¾Ð»Ñ\8f, Ð¾Ð½Ð¾ Ð²Ñ\81Ñ\91 Ñ\80авно Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ñ\8dÑ\82о **знаÑ\87ение Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e**.
+…то, поскольку у `description` есть значение по умолчанию, если вы **ничего не вернёте** для этого поля, оно всё равно будет иметь это **значение по умолчанию**.
 
 ### Модель для данных ответа { #model-for-output-response-data }
 
 
 Это означает, что у него **всегда будет какое‑то значение**, просто иногда это значение может быть `None` (или `null` в JSON).
 
¡Ð»ÐµÐ´Ð¾Ð²Ð°Ñ\82елÑ\8cно, ÐºÐ»Ð¸ÐµÐ½Ñ\82ам, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\89им Ð²Ð°Ñ\88 API, Ð½Ðµ Ð½Ñ\83жно Ð¿Ñ\80овеÑ\80Ñ\8fÑ\82Ñ\8c Ð½Ð°Ð»Ð¸Ñ\87ие Ñ\8dÑ\82ого Ð·Ð½Ð°Ñ\87ениÑ\8f: Ð¾Ð½Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\82 **иÑ\81Ñ\85одиÑ\82Ñ\8c Ð¸Ð· Ñ\82ого, Ñ\87Ñ\82о Ð¿Ð¾Ð»Ðµ Ð²Ñ\81егда Ð¿Ñ\80иÑ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82**, Ð° Ð² Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85 Ð¸Ð¼ÐµÐµÑ\82 значение по умолчанию `None`.
­Ñ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о ÐºÐ»Ð¸ÐµÐ½Ñ\82ам, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\89им Ð²Ð°Ñ\88 API, Ð½Ðµ Ð½Ñ\83жно Ð¿Ñ\80овеÑ\80Ñ\8fÑ\82Ñ\8c, Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ð»Ð¸ Ñ\8dÑ\82о Ð·Ð½Ð°Ñ\87ение Ð¸Ð»Ð¸ Ð½ÐµÑ\82: Ð¾Ð½Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\82 **иÑ\81Ñ\85одиÑ\82Ñ\8c Ð¸Ð· Ñ\82ого, Ñ\87Ñ\82о Ð¿Ð¾Ð»Ðµ Ð²Ñ\81егда Ð¿Ñ\80иÑ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82**, Ð½Ð¾ Ð² Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85 Ð¾Ð½Ð¾ Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c значение по умолчанию `None`.
 
 В OpenAPI это описывается тем, что поле помечается как **обязательное**, поскольку оно всегда присутствует.
 
 Из‑за этого JSON Schema для модели может отличаться в зависимости от использования для **входа** или **выхода**:
 
-* для **входа** `description` не будет обязательным
+* для **входа** `description` **не будет обязательным**
 * для **выхода** оно будет **обязательным** (и при этом может быть `None`, или, в терминах JSON, `null`)
 
 ### Выходная модель в документации { #model-for-output-in-docs }
@@ -81,9 +81,9 @@
 
 Однако бывают случаи, когда вы хотите иметь **одну и ту же схему для входа и выхода**.
 
\93лавнÑ\8bй Ñ\81Ñ\86енаÑ\80ий â\80\94 ÐºÐ¾Ð³Ð´Ð° Ñ\83 Ð²Ð°Ñ\81 Ñ\83же ÐµÑ\81Ñ\82Ñ\8c Ñ\81генеÑ\80иÑ\80ованнÑ\8bй ÐºÐ»Ð¸ÐµÐ½Ñ\82Ñ\81кий ÐºÐ¾Ð´/SDK, Ð¸ Ð²Ñ\8b Ð¿Ð¾ÐºÐ° Ð½Ðµ Ñ\85оÑ\82иÑ\82е Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ\8fÑ\82Ñ\8c Ð²ÐµÑ\81Ñ\8c Ñ\8dÑ\82оÑ\82 Ð°Ð²Ñ\82огенеÑ\80иÑ\80Ñ\83емÑ\8bй ÐºÐ¾Ð´/SDK (Ñ\80ано Ð¸Ð»Ð¸ Ð¿Ð¾Ð·Ð´Ð½Ð¾ Ð²Ñ\8b Ñ\8dÑ\82о Ñ\81делаеÑ\82е, Ð½Ð¾ Ð½Ðµ Ñ\81ейÑ\87аÑ\81).
\93лавнÑ\8bй Ñ\81Ñ\86енаÑ\80ий â\80\94 ÐºÐ¾Ð³Ð´Ð° Ñ\83 Ð²Ð°Ñ\81 Ñ\83же ÐµÑ\81Ñ\82Ñ\8c Ñ\81генеÑ\80иÑ\80ованнÑ\8bй ÐºÐ»Ð¸ÐµÐ½Ñ\82Ñ\81кий ÐºÐ¾Ð´/SDK, Ð¸ Ð²Ñ\8b Ð¿Ð¾ÐºÐ° Ð½Ðµ Ñ\85оÑ\82иÑ\82е Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ\8fÑ\82Ñ\8c Ð²ÐµÑ\81Ñ\8c Ñ\8dÑ\82оÑ\82 Ð°Ð²Ñ\82огенеÑ\80иÑ\80Ñ\83емÑ\8bй ÐºÐ»Ð¸ÐµÐ½Ñ\82Ñ\81кий ÐºÐ¾Ð´/SDK, Ð²ÐµÑ\80оÑ\8fÑ\82но, Ð²Ñ\8b Ð·Ð°Ñ\85оÑ\82иÑ\82е Ñ\81делаÑ\82Ñ\8c Ñ\8dÑ\82о Ð² ÐºÐ°ÐºÐ¾Ð¹-Ñ\82о Ð¼Ð¾Ð¼ÐµÐ½Ñ\82, Ð½Ð¾, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, Ð½Ðµ Ð¿Ñ\80Ñ\8fмо Ñ\81ейÑ\87аÑ\81.
 
-В таком случае вы можете отключить эту функциональность в FastAPI с помощью параметра `separate_input_output_schemas=False`.
+В таком случае вы можете отключить эту функциональность в **FastAPI** с помощью параметра `separate_input_output_schemas=False`.
 
 /// info | Информация
 
 
 ### Одна и та же схема для входной и выходной моделей в документации { #same-schema-for-input-and-output-models-in-docs }
 
¢ÐµÐ¿ÐµÑ\80Ñ\8c Ð´Ð»Ñ\8f Ñ\8dÑ\82ой модели будет одна общая схема и для входа, и для выхода — только `Item`, и в ней `description` будет **не обязательным**:
\98 Ñ\82епеÑ\80Ñ\8c Ð´Ð»Ñ\8f модели будет одна общая схема и для входа, и для выхода — только `Item`, и в ней `description` будет **не обязательным**:
 
 <div class="screenshot">
 <img src="/img/tutorial/separate-openapi-schemas/image05.png">
 </div>
-
-Это то же поведение, что и в Pydantic v1. 🤓
index b562cbe5bcfd6d2becfe7ea84384cc302884cc04..02b1c9a286074db955646914ecfd56b251408d5d 100644 (file)
@@ -5,10 +5,10 @@
 </style>
 
 <p align="center">
-  <a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
+  <a href="https://fastapi.tiangolo.com/ru"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
 </p>
 <p align="center">
-    <em>ФÑ\80еймвоÑ\80к FastAPI: Ð²Ñ\8bÑ\81окаÑ\8f Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c, Ð¿Ñ\80оÑ\81Ñ\82 Ð² Ð¸Ð·Ñ\83Ñ\87ении, Ð±Ñ\8bÑ\81Ñ\82Ñ\80Ñ\8bй Ð² Ñ\80азÑ\80абоÑ\82ке, готов к продакшн</em>
+    <em>ФÑ\80еймвоÑ\80к FastAPI: Ð²Ñ\8bÑ\81окаÑ\8f Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c, Ð¿Ñ\80оÑ\81Ñ\82 Ð² Ð¸Ð·Ñ\83Ñ\87ении, Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fеÑ\82 Ð±Ñ\8bÑ\81Ñ\82Ñ\80о Ð¿Ð¸Ñ\81аÑ\82Ñ\8c ÐºÐ¾Ð´, готов к продакшн</em>
 </p>
 <p align="center">
 <a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
@@ -40,7 +40,7 @@ FastAPI — это современный, быстрый (высокопрои
 * **Скорость**: Очень высокая производительность, на уровне **NodeJS** и **Go** (благодаря Starlette и Pydantic). [Один из самых быстрых доступных фреймворков Python](#performance).
 * **Быстрота разработки**: Увеличьте скорость разработки фич примерно на 200–300%. *
 * **Меньше ошибок**: Сократите примерно на 40% количество ошибок, вызванных человеком (разработчиком). *
-* **Интуитивность**: Отличная поддержка редактора кода. <abbr title="также известное как: автодополнение, IntelliSense">Автозавершение</abbr> везде. Меньше времени на отладку.
+* **Интуитивность**: Отличная поддержка редактора кода. <abbr title="также известное как: автодополнение, автозавершение, IntelliSense">Автозавершение</abbr> везде. Меньше времени на отладку.
 * **Простота**: Разработан так, чтобы его было легко использовать и осваивать. Меньше времени на чтение документации.
 * **Краткость**: Минимизируйте дублирование кода. Несколько возможностей из каждого объявления параметров. Меньше ошибок.
 * **Надежность**: Получите код, готовый к продакшн. С автоматической интерактивной документацией.
@@ -117,6 +117,12 @@ FastAPI — это современный, быстрый (высокопрои
 
 ---
 
+## Мини-документальный фильм о FastAPI { #fastapi-mini-documentary }
+
+В конце 2025 года вышел <a href="https://www.youtube.com/watch?v=mpR8ngthqiE" class="external-link" target="_blank">мини-документальный фильм о FastAPI</a>, вы можете посмотреть его онлайн:
+
+<a href="https://www.youtube.com/watch?v=mpR8ngthqiE" target="_blank"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
+
 ## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
 
 <a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
@@ -257,7 +263,7 @@ INFO:     Application startup complete.
 
 * Получает HTTP-запросы по _путям_ `/` и `/items/{item_id}`.
 * Оба _пути_ используют `GET` <em>операции</em> (также известные как HTTP _методы_).
-* _Путь_ `/items/{item_id}` имеет _параметр пути_ `item_id`, который должен быть `int`.
+* _Путь_ `/items/{item_id}` имеет _path-параметр_ `item_id`, который должен быть `int`.
 * _Путь_ `/items/{item_id}` имеет необязательный `str` _параметр запроса_ `q`.
 
 ### Интерактивная документация API { #interactive-api-docs }
@@ -278,9 +284,9 @@ INFO:     Application startup complete.
 
 ## Пример обновления { #example-upgrade }
 
-Теперь измените файл `main.py`, чтобы принимать тело запроса из `PUT` запроса.
+Теперь измените файл `main.py`, чтобы принимать тело запроса из `PUT` HTTP-запроса.
 
-Объявите тело, используя стандартные типы Python, спасибо Pydantic.
+Объявите тело запроса, используя стандартные типы Python, спасибо Pydantic.
 
 ```Python hl_lines="4  9-12  25-27"
 from typing import Union
@@ -318,7 +324,7 @@ def update_item(item_id: int, item: Item):
 
 Перейдите на <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
 
-* Интерактивная документация API будет автоматически обновлена, включая новое тело:
+* Интерактивная документация API будет автоматически обновлена, включая новое тело запроса:
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
 
@@ -334,13 +340,13 @@ def update_item(item_id: int, item: Item):
 
 Теперь откройте <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
 
-* Альтернативная документация также отразит новый параметр запроса и тело:
+* Альтернативная документация также отразит новый параметр запроса и тело запроса:
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
 
 ### Подведём итоги { #recap }
 
\98Ñ\82ак, Ð²Ñ\8b Ð¾Ð±Ñ\8aÑ\8fвлÑ\8fеÑ\82е **один Ñ\80аз** Ñ\82ипÑ\8b Ð¿Ð°Ñ\80амеÑ\82Ñ\80ов, Ñ\82ела запроса и т.д. как параметры функции.
\98Ñ\82ак, Ð²Ñ\8b Ð¾Ð±Ñ\8aÑ\8fвлÑ\8fеÑ\82е **один Ñ\80аз** Ñ\82ипÑ\8b Ð¿Ð°Ñ\80амеÑ\82Ñ\80ов, Ñ\82ело запроса и т.д. как параметры функции.
 
 Вы делаете это с помощью стандартных современных типов Python.
 
@@ -390,13 +396,13 @@ item: Item
 
 Возвращаясь к предыдущему примеру кода, **FastAPI** будет:
 
-* Валидировать наличие `item_id` в пути для `GET` и `PUT` запросов.
-* Валидировать, что `item_id` имеет тип `int` для `GET` и `PUT` запросов.
+* Валидировать наличие `item_id` в пути для `GET` и `PUT` HTTP-запросов.
+* Валидировать, что `item_id` имеет тип `int` для `GET` и `PUT` HTTP-запросов.
     * Если это не так, клиент увидит полезную понятную ошибку.
-* Проверять, есть ли необязательный параметр запроса с именем `q` (например, `http://127.0.0.1:8000/items/foo?q=somequery`) для `GET` запросов.
+* Проверять, есть ли необязательный параметр запроса с именем `q` (например, `http://127.0.0.1:8000/items/foo?q=somequery`) для `GET` HTTP-запросов.
     * Поскольку параметр `q` объявлен с `= None`, он необязателен.
     * Без `None` он был бы обязательным (как тело запроса в случае с `PUT`).
-* Для `PUT` запросов к `/items/{item_id}` читать тело запроса как JSON:
+* Для `PUT` HTTP-запросов к `/items/{item_id}` читать тело запроса как JSON:
     * Проверять, что есть обязательный атрибут `name`, который должен быть `str`.
     * Проверять, что есть обязательный атрибут `price`, который должен быть `float`.
     * Проверять, что есть необязательный атрибут `is_offer`, который должен быть `bool`, если он присутствует.
@@ -435,11 +441,11 @@ item: Item
 
 Более полный пример с дополнительными возможностями см. в <a href="https://fastapi.tiangolo.com/ru/tutorial/">Учебник - Руководство пользователя</a>.
 
-**Осторожно, спойлер**: учебник - руководство включает:
+**Ð\9eÑ\81Ñ\82оÑ\80ожно, Ñ\81пойлеÑ\80**: Ñ\83Ñ\87ебник - Ñ\80Ñ\83ководÑ\81Ñ\82во Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f Ð²ÐºÐ»Ñ\8eÑ\87аеÑ\82:
 
 * Объявление **параметров** из других источников: **HTTP-заголовки**, **cookies**, **поля формы** и **файлы**.
 * Как задать **ограничения валидации** вроде `maximum_length` или `regex`.
-* Очень мощную и простую в использовании систему **<abbr title="также известная как: компоненты, ресурсы, провайдеры, сервисы, инъекции">внедрения зависимостей</abbr>**.
+* Очень мощную и простую в использовании систему **<abbr title="также известна как: компоненты, ресурсы, провайдеры, сервисы, инъекции">внедрения зависимостей</abbr>**.
 * Безопасность и аутентификацию, включая поддержку **OAuth2** с **JWT токенами** и **HTTP Basic** аутентификацию.
 * Более продвинутые (но столь же простые) приёмы объявления **глубоко вложенных JSON-моделей** (спасибо Pydantic).
 * Интеграцию **GraphQL** с <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> и другими библиотеками.
@@ -524,11 +530,11 @@ FastAPI зависит от Pydantic и Starlette.
 
 * <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> — обязателен, если вы хотите использовать `TestClient`.
 * <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> — обязателен, если вы хотите использовать конфигурацию шаблонов по умолчанию.
-* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a>  обязателен, если вы хотите поддерживать <abbr title="преобразование строки, полученной из HTTP-запроса, в данные Python">«парсинг»</abbr> форм через `request.form()`.
+* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - обязателен, если вы хотите поддерживать <abbr title="преобразование строки, полученной из HTTP-запроса, в данные Python">«парсинг»</abbr> форм через `request.form()`.
 
 Используется FastAPI:
 
-* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> — сервер, который загружает и обслуживает ваше приложение. Включает `uvicorn[standard]`, содержащий некоторые зависимости (например, `uvloop`), нужные для высокой производительности.
+* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> — сервер, который загружает и «отдаёт» ваше приложение. Включает `uvicorn[standard]`, содержащий некоторые зависимости (например, `uvloop`), нужные для высокой производительности.
 * `fastapi-cli[standard]` — чтобы предоставить команду `fastapi`.
     * Включает `fastapi-cloud-cli`, который позволяет развернуть ваше приложение FastAPI в <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
 
index 5e5d6ada94f85b037618918724e2a2b154809dc4..76304523c951fa4c14c2a2f712451b8c50e92936 100644 (file)
@@ -1,4 +1,4 @@
-# Большие приложения, в которых много файлов { #bigger-applications-multiple-files }
+# Большие приложения — несколько файлов { #bigger-applications-multiple-files }
 
 При построении приложения или веб-API нам редко удается поместить всё в один файл.
 
@@ -31,7 +31,7 @@
 
 /// tip | Подсказка
 
\9eбÑ\80аÑ\82иÑ\82е Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ, Ñ\87Ñ\82о Ð² ÐºÐ°Ð¶Ð´Ð¾Ð¼ ÐºÐ°Ñ\82алоге Ð¸ Ð¿Ð¾Ð´ÐºÐ°Ñ\82алоге Ð¸Ð¼ÐµÐµÑ\82Ñ\81Ñ\8f Ñ\84айл `__init__.py`
\95Ñ\81Ñ\82Ñ\8c Ð½ÐµÑ\81колÑ\8cко Ñ\84айлов `__init__.py`: Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ\83 Ð² ÐºÐ°Ð¶Ð´Ð¾Ð¼ ÐºÐ°Ñ\82алоге Ð¸Ð»Ð¸ Ð¿Ð¾Ð´ÐºÐ°Ñ\82алоге.
 
 Это как раз то, что позволяет импортировать код из одного файла в другой.
 
@@ -43,61 +43,63 @@ from app.routers import items
 
 ///
 
-* Всё помещается в каталоге `app`. В нём также находится пустой файл `app/__init__.py`. Таким образом, `app` является "Python-пакетом" (коллекцией модулей Python).
-* Он содержит файл `app/main.py`. Данный файл является частью пакета (т.е. находится внутри каталога, содержащего файл `__init__.py`), и, соответственно, он является модулем пакета: `app.main`.
+* Всё помещается в каталоге `app`. В нём также находится пустой файл `app/__init__.py`. Таким образом, `app` является "Python-пакетом" (коллекцией "Python-модулей"): `app`.
+* Он содержит файл `app/main.py`. Данный файл является частью Python-пакета (т.е. находится внутри каталога, содержащего файл `__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/routers/`, содержащий `__init__.py`. Он является Python-подпакетом: `app.routers`.
+* Файл `app/routers/items.py` находится внутри пакета `app/routers/`. Таким образом, он является подмодулем: `app.routers.items`.
+* Точно так же `app/routers/users.py` является ещё одним подмодулем: `app.routers.users`.
+* Подкаталог `app/internal/`, содержащий файл `__init__.py`, является ещё одним Python-подпакетом: `app.internal`.
+* А файл `app/internal/admin.py` является ещё одним подмодулем: `app.internal.admin`.
 
 <img src="/img/tutorial/bigger-applications/package.drawio.svg">
 
 Та же самая файловая структура приложения, но с комментариями:
 
-```
+```bash
 .
 ├── 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
+│   └── 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` { #apirouter }
 
-Давайте предположим, что для работы с пользователями используется отдельный файл (суб-модуль) `/app/routers/users.py`.
+Давайте предположим, что для работы с пользователями используется отдельный файл (подмодуль) `/app/routers/users.py`.
 
\94лÑ\8f Ð»Ñ\83Ñ\87Ñ\88ей Ð¾Ñ\80ганизаÑ\86ии Ð¿Ñ\80иложениÑ\8f, Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¾Ñ\82делиÑ\82Ñ\8c Ð¾Ð¿ÐµÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и, Ñ\81вÑ\8fзаннÑ\8bе Ñ\81 Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8fми, Ð¾Ñ\82 Ð¾Ñ\81Ñ\82алÑ\8cного ÐºÐ¾Ð´Ð°.
\92Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¾Ñ\82делиÑ\82Ñ\8c *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и*, Ñ\81вÑ\8fзаннÑ\8bе Ñ\81 Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8fми, Ð¾Ñ\82 Ð¾Ñ\81Ñ\82алÑ\8cного ÐºÐ¾Ð´Ð°, Ñ\87Ñ\82обÑ\8b Ñ\81оÑ\85Ñ\80аниÑ\82Ñ\8c Ð¿Ð¾Ñ\80Ñ\8fдок.
 
\9dо Ñ\82ак, Ñ\87Ñ\82обÑ\8b Ñ\8dÑ\82и Ð¾Ð¿ÐµÑ\80аÑ\86ии Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð¾Ñ\81Ñ\82авалиÑ\81Ñ\8c Ñ\87аÑ\81Ñ\82Ñ\8cÑ\8e **FastAPI** Ð¿Ñ\80иложениÑ\8f/веб-API (Ñ\87аÑ\81Ñ\82Ñ\8cÑ\8e Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¿Ð°ÐºÐµÑ\82а)
\9dо Ñ\8dÑ\82о Ð²Ñ\81Ñ\91 Ñ\80авно Ñ\87аÑ\81Ñ\82Ñ\8c Ñ\82ого Ð¶Ðµ Ð¿Ñ\80иложениÑ\8f/веб-API Ð½Ð° **FastAPI** (Ñ\87аÑ\81Ñ\82Ñ\8c Ñ\82ого Ð¶Ðµ Â«Python-пакеÑ\82а»).
 
-С помощью  `APIRouter` вы можете создать *операции пути* (*эндпоинты*) для данного модуля.
+С помощью `APIRouter` вы можете создать *операции пути* для этого модуля.
 
 ### Импорт `APIRouter` { #import-apirouter }
 
-Точно также, как и в случае с классом `FastAPI`, вам нужно импортировать и создать объект класса `APIRouter`.
+Точно так же, как и в случае с классом `FastAPI`, вам нужно импортировать и создать его «экземпляр»:
 
 {* ../../docs_src/bigger_applications/app_an_py39/routers/users.py hl[1,3] title["app/routers/users.py"] *}
 
-### Создание *эндпоинтов* с помощью `APIRouter` { #path-operations-with-apirouter }
+### *Операции пути* с `APIRouter` { #path-operations-with-apirouter }
+
+И затем вы используете его, чтобы объявить ваши *операции пути*.
 
\92 Ð´Ð°Ð»Ñ\8cнейÑ\88ем Ð¸Ñ\81полÑ\8cзÑ\83йÑ\82е `APIRouter` Ð´Ð»Ñ\8f Ð¾Ð±Ñ\8aÑ\8fвлениÑ\8f *Ñ\8dндпоинÑ\82ов*, Ñ\82оÑ\87но Ñ\82акже, ÐºÐ°Ðº Ð²Ñ\8b Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82е класс `FastAPI`:
\98Ñ\81полÑ\8cзÑ\83йÑ\82е ÐµÐ³Ð¾ Ñ\82ак Ð¶Ðµ, ÐºÐ°Ðº Ð²Ñ\8b Ð¸Ñ\81полÑ\8cзовали Ð±Ñ\8b класс `FastAPI`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/routers/users.py hl[6,11,16] title["app/routers/users.py"] *}
 
-Вы можете думать об `APIRouter` как об "уменьшенной версии" класса FastAPI`.
+Вы можете думать об `APIRouter` как об «мини-классе `FastAPI`».
 
-`APIRouter` поддерживает все те же самые опции.
+Поддерживаются все те же опции.
 
-`APIRouter` поддерживает все те же самые параметры, такие как `parameters`, `responses`, `dependencies`, `tags`, и т. д.
+Все те же `parameters`, `responses`, `dependencies`, `tags` и т.д.
 
 /// tip | Подсказка
 
@@ -105,21 +107,21 @@ from app.routers import items
 
 ///
 
-Мы собираемся подключить данный `APIRouter` к нашему основному приложению на `FastAPI`, но сначала давайте проверим зависимости и создадим ещё один модуль с `APIRouter`.
+Мы собираемся подключить данный `APIRouter` к нашему основному приложению на `FastAPI`, но сначала давайте проверим зависимости и ещё один `APIRouter`.
 
 ## Зависимости { #dependencies }
 
\9dам Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ñ\8fÑ\82Ñ\81Ñ\8f Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð¼Ñ\8b Ð±Ñ\83дем Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð² Ñ\80азнÑ\8bÑ\85 Ð¼ÐµÑ\81Ñ\82аÑ\85 Ð½Ð°Ñ\88его приложения.
\9cÑ\8b Ð²Ð¸Ð´Ð¸Ð¼, Ñ\87Ñ\82о Ð½Ð°Ð¼ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ñ\8fÑ\82Ñ\81Ñ\8f Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ð½ÐµÑ\81колÑ\8cкиÑ\85 Ð¼ÐµÑ\81Ñ\82аÑ\85 приложения.
 
\9cы поместим их в отдельный модуль `dependencies` (`app/dependencies.py`).
\9fоÑ\8dÑ\82омÑ\83 Ð¼ы поместим их в отдельный модуль `dependencies` (`app/dependencies.py`).
 
-ТепеÑ\80Ñ\8c Ð¼Ñ\8b Ð²Ð¾Ñ\81полÑ\8cзÑ\83емÑ\81Ñ\8f Ð¿Ñ\80оÑ\81Ñ\82ой Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82Ñ\8cÑ\8e, Ñ\87Ñ\82обÑ\8b Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c ÐºÐ°Ñ\81Ñ\82омизиÑ\80ованнÑ\8bй `X-Token` Ð¸Ð· Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°:
+ТепеÑ\80Ñ\8c Ð¼Ñ\8b Ð²Ð¾Ñ\81полÑ\8cзÑ\83емÑ\81Ñ\8f Ð¿Ñ\80оÑ\81Ñ\82ой Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82Ñ\8cÑ\8e, Ñ\87Ñ\82обÑ\8b Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c ÐºÐ°Ñ\81Ñ\82омнÑ\8bй HTTP-заголовок `X-Token`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/dependencies.py hl[3,6:8] title["app/dependencies.py"] *}
 
 /// tip | Подсказка
 
\94лÑ\8f Ð¿Ñ\80оÑ\81Ñ\82оÑ\82Ñ\8b Ð¼Ñ\8b Ð²Ð¾Ñ\81полÑ\8cзовалиÑ\81Ñ\8c Ð½ÐµÐºÐ¸Ð¼ Ð²Ð¾Ð¾Ð±Ñ\80ажаемÑ\8bм Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ком.
\94лÑ\8f Ð¿Ñ\80оÑ\81Ñ\82оÑ\82Ñ\8b Ð¼Ñ\8b Ð²Ð¾Ñ\81полÑ\8cзовалиÑ\81Ñ\8c Ð²Ñ\8bдÑ\83маннÑ\8bм Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ком.
 
 В реальных случаях для получения наилучших результатов используйте интегрированные [утилиты безопасности](security/index.md){.internal-link target=_blank}.
 
@@ -127,30 +129,29 @@ from app.routers import items
 
 ## Ещё один модуль с `APIRouter` { #another-module-with-apirouter }
 
-Давайте также предположим, что у вас есть *эндпоинты*, отвечающие за обработку "items", и они находятся в модуле `app/routers/items.py`.
+Давайте также предположим, что у вас есть эндпоинты, отвечающие за обработку «items» в вашем приложении, и они находятся в модуле `app/routers/items.py`.
 
-У вас определены следующие *операции пути* (*эндпоинты*):
+У вас определены *операции пути* для:
 
 * `/items/`
 * `/items/{item_id}`
 
-ТÑ\83Ñ\82 Ð²Ñ\81Ñ\91 Ñ\82оÑ\87но Ñ\82акже, ÐºÐ°Ðº Ð¸ Ð² Ñ\81иÑ\82Ñ\83аÑ\86ии с `app/routers/users.py`.
+ТÑ\83Ñ\82 Ð²Ñ\81Ñ\91 Ñ\82а Ð¶Ðµ Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80а, ÐºÐ°Ðº Ð¸ Ð² Ñ\81лÑ\83Ñ\87ае с `app/routers/users.py`.
 
-Но теперь мы хотим поступить немного умнее и слегка упростить код.
+Но мы хотим поступить умнее и слегка упростить код.
 
-Мы знаем, что все *эндпоинты* данного модуля имеют некоторые общие свойства:
+Мы знаем, что все *операции пути* этого модуля имеют одинаковые:
 
-* Префикс пути: `/items`.
-* Теги: (один единственный тег: `items`).
-* Дополнительные ответы (responses)
-* Зависимости: использование созданной нами зависимости `X-token`
+* `prefix` пути: `/items`.
+* `tags`: (один единственный тег: `items`).
+* Дополнительные `responses`.
+* `dependencies`: всем им нужна та зависимость `X-Token`, которую мы создали.
 
-Таким образом, вместо того чтобы добавлять все эти свойства в функцию каждого отдельного *эндпоинта*,
-мы добавим их в `APIRouter`.
+Таким образом, вместо того чтобы добавлять всё это в каждую *операцию пути*, мы можем добавить это в `APIRouter`.
 
 {* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *}
 
-Так ÐºÐ°Ðº ÐºÐ°Ð¶Ð´Ñ\8bй *Ñ\8dндпоинÑ\82* Ð½Ð°Ñ\87инаеÑ\82Ñ\81Ñ\8f Ñ\81 Ñ\81имвола `/`:
+Так ÐºÐ°Ðº Ð¿Ñ\83Ñ\82Ñ\8c ÐºÐ°Ð¶Ð´Ð¾Ð¹ *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и* Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð½Ð°Ñ\87инаÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81 `/`, ÐºÐ°Ðº Ð·Ð´ÐµÑ\81Ñ\8c:
 
 ```Python hl_lines="1"
 @router.get("/{item_id}")
@@ -162,73 +163,74 @@ async def read_item(item_id: str):
 
 В нашем случае префиксом является `/items`.
 
-Мы также можем добавить в наш маршрутизатор (router) список `тегов` (`tags`) и дополнительных `ответов` (`responses`), которые являются общими для каждого *эндпоинта*.
+Мы также можем добавить список `tags` и дополнительные `responses`, которые будут применяться ко всем *операциям пути*, включённым в этот маршрутизатор.
 
-И ещё мы можем добавить в наш маршрутизатор список `зависимостей`, которые должны вызываться при каждом обращении к *эндпоинтам*.
+И ещё мы можем добавить список `dependencies`, которые будут добавлены ко всем *операциям пути* в маршрутизаторе и будут выполняться/разрешаться для каждого HTTP-запроса к ним.
 
 /// tip | Подсказка
 
-Обратите внимание, что также, как и в случае с зависимостями в декораторах *эндпоинтов* ([зависимости в декораторах операций пути](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), никакого значения в *функцию эндпоинта* передано не будет.
+Обратите внимание, что так же, как и в случае с [зависимостями в декораторах *операций пути*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, никакое значение не будет передано в вашу *функцию-обработчик пути*.
 
 ///
 
\92 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82е Ð¼Ñ\8b Ð¿Ð¾Ð»Ñ\83Ñ\87им Ñ\81ледÑ\83Ñ\8eÑ\89ие Ñ\8dндпоинÑ\82Ñ\8b:
\92 Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82е Ð¿Ñ\83Ñ\82и Ð´Ð»Ñ\8f items Ñ\82епеÑ\80Ñ\8c Ñ\82акие:
 
 * `/items/`
 * `/items/{item_id}`
 
 ...как мы и планировали.
 
-* Ð\9eни Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾Ð¼ÐµÑ\87енÑ\8b Ñ\82егами Ð¸Ð· Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñ\81пиÑ\81ка, Ð² Ð½Ð°Ñ\88ем Ñ\81лÑ\83Ñ\87ае Ñ\8dÑ\82о `"items"`.
-    * Эти теги особенно полезны для системы автоматической интерактивной документации (с использованием OpenAPI).
-* Ð\9aаждÑ\8bй Ð¸Ð· Ð½Ð¸Ñ\85 Ð±Ñ\83деÑ\82 Ð²ÐºÐ»Ñ\8eÑ\87аÑ\82Ñ\8c Ð¿Ñ\80едопÑ\80еделеннÑ\8bе Ð¾Ñ\82веÑ\82Ñ\8b `responses`.
-* Ð\9aаждÑ\8bй *Ñ\8dндпоинÑ\82* Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ñ\81пиÑ\81ок Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82ей (`dependencies`), Ð¸Ñ\81полнÑ\8fемÑ\8bÑ\85 Ð¿ÐµÑ\80ед Ð²Ñ\8bзовом *Ñ\8dндпоинÑ\82а*.
-    * Если вы определили зависимости в самой операции пути, **то она также будет выполнена**.
-    * Сначала выполняются зависимости маршрутизатора, затем вызываются [зависимости в декораторе](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, и, наконец, обычные параметрические зависимости.
-    * Вы также можете добавить [зависимости `Security` с `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}.
+* Ð\9eни Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾Ð¼ÐµÑ\87енÑ\8b Ñ\81пиÑ\81ком Ñ\82егов, Ñ\81одеÑ\80жаÑ\89им Ð¾Ð´Ð½Ñ\83 Ñ\81Ñ\82Ñ\80окÑ\83 `"items"`.
+    * Эти «теги» особенно полезны для систем автоматической интерактивной документации (с использованием OpenAPI).
+* Ð\92Ñ\81е Ð¾Ð½Ð¸ Ð±Ñ\83дÑ\83Ñ\82 Ð²ÐºÐ»Ñ\8eÑ\87аÑ\82Ñ\8c Ð¿Ñ\80едопÑ\80еделÑ\91ннÑ\8bе `responses`.
+* Ð\92Ñ\81е Ñ\8dÑ\82и *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и* Ð±Ñ\83дÑ\83Ñ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ñ\81пиÑ\81ок `dependencies`, Ð²Ñ\8bÑ\87иÑ\81лÑ\8fемÑ\8bÑ\85/вÑ\8bполнÑ\8fемÑ\8bÑ\85 Ð¿ÐµÑ\80ед Ð½Ð¸Ð¼Ð¸.
+    * Если вы также объявите зависимости в конкретной *операции пути*, **они тоже будут выполнены**.
+    * Сначала выполняются зависимости маршрутизатора, затем [`dependencies` в декораторе](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, и затем обычные параметрические зависимости.
+    * Вы также можете добавить [`Security`-зависимости с `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}.
 
 /// tip | Подсказка
 
-Например, с помощью зависимостей в `APIRouter` мы можем потребовать аутентификации для доступа ко всей группе *эндпоинтов*, не указывая зависимости для каждой отдельной функции *эндпоинта*.
+Например, с помощью зависимостей в `APIRouter` мы можем потребовать аутентификации для доступа ко всей группе *операций пути*. Даже если зависимости не добавляются по отдельности к каждой из них.
 
 ///
 
 /// check | Заметка
 
-Параметры `prefix`, `tags`, `responses` и `dependencies` относятся к функционалу **FastAPI**, помогающему избежать дублирования кода.
+Параметры `prefix`, `tags`, `responses` и `dependencies` — это (как и во многих других случаях) просто возможность **FastAPI**, помогающая избежать дублирования кода.
 
 ///
 
 ### Импорт зависимостей { #import-the-dependencies }
 
\9dаÑ\88 ÐºÐ¾Ð´ Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð² Ð¼Ð¾Ð´Ñ\83ле `app.routers.items` (Ñ\84айл `app/routers/items.py`).
­Ñ\82оÑ\82 ÐºÐ¾Ð´ Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð² Ð¼Ð¾Ð´Ñ\83ле `app.routers.items`, Ð² Ñ\84айле `app/routers/items.py`.
 
\98 Ð½Ð°Ð¼ Ð½Ñ\83жно Ð²Ñ\8bзваÑ\82Ñ\8c Ñ\84Ñ\83нкÑ\86иÑ\8e Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и Ð¸Ð· Ð¼Ð¾Ð´Ñ\83лÑ\8f `app.dependencies` (Ñ\84айл `app/dependencies.py`).
\98 Ð½Ð°Ð¼ Ð½Ñ\83жно Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ñ\84Ñ\83нкÑ\86иÑ\8e Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и Ð¸Ð· Ð¼Ð¾Ð´Ñ\83лÑ\8f `app.dependencies`, Ñ\84айла `app/dependencies.py`.
 
\9cÑ\8b Ð¸Ñ\81полÑ\8cзÑ\83ем Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cного Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82а `..` Ð´Ð»Ñ\8f Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82а Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и:
\9fоÑ\8dÑ\82омÑ\83 Ð¼Ñ\8b Ð¸Ñ\81полÑ\8cзÑ\83ем Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cнÑ\8bй Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82 Ñ\81 `..` Ð´Ð»Ñ\8f Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82ей:
 
 {* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[3] title["app/routers/items.py"] *}
 
-#### Как работает относительный импорт? { #how-relative-imports-work }
+#### Как работает относительный импорт { #how-relative-imports-work }
 
 /// tip | Подсказка
 
-Если вы прекрасно знаете, как работает импорт в Python, то переходите к следующему разделу.
+Если вы прекрасно знаете, как работает импорт, переходите к следующему разделу ниже.
 
 ///
 
\9eдна Ñ\82оÑ\87ка `.`, ÐºÐ°Ðº Ð² Ð´Ð°Ð½Ð½Ð¾Ð¼ Ð¿Ñ\80имеÑ\80е:
\9eдна Ñ\82оÑ\87ка `.`, ÐºÐ°Ðº Ð·Ð´ÐµÑ\81Ñ\8c:
 
 ```Python
 from .dependencies import get_token_header
 ```
+
 означает:
 
-* Ð\9dаÑ\87ниÑ\82е Ñ\81 Ð¿Ð°ÐºÐµÑ\82а, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py` Ñ\80аÑ\81положен Ð² ÐºÐ°Ñ\82алоге `app/routers/`)...
-* ... найдите модуль `dependencies` (файл `app/routers/dependencies.py`)...
-* ... и импортируйте из него функцию `get_token_header`.
+* Ð\9dаÑ\87аÑ\82Ñ\8c Ð² Ñ\82ом Ð¶Ðµ Ð¿Ð°ÐºÐµÑ\82е, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ñ\8dÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py`) (каÑ\82алог `app/routers/`)...
+* найти модуль `dependencies` (воображаемый файл `app/routers/dependencies.py`)...
+* и импортировать из него функцию `get_token_header`.
 
\9a Ñ\81ожалениÑ\8e, Ñ\82акого Ñ\84айла Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82, Ð¸ наши зависимости находятся в файле `app/dependencies.py`.
\9dо Ñ\82акого Ñ\84айла Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82, наши зависимости находятся в файле `app/dependencies.py`.
 
 Вспомните, как выглядит файловая структура нашего приложения:
 
@@ -236,7 +238,7 @@ from .dependencies import get_token_header
 
 ---
 
\94ве Ñ\82оÑ\87ки `..`, ÐºÐ°Ðº Ð² Ð´Ð°Ð½Ð½Ð¾Ð¼ Ð¿Ñ\80имеÑ\80е:
\94ве Ñ\82оÑ\87ки `..`, ÐºÐ°Ðº Ð·Ð´ÐµÑ\81Ñ\8c:
 
 ```Python
 from ..dependencies import get_token_header
@@ -244,12 +246,12 @@ from ..dependencies import get_token_header
 
 означают:
 
-* Ð\9dаÑ\87ниÑ\82е Ñ\81 Ð¿Ð°ÐºÐµÑ\82а, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py` Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð² ÐºÐ°Ñ\82алоге `app/routers/`)...
-* ... перейдите в родительский пакет (каталог `app/`)...
-* ... найдите в нём модуль `dependencies` (файл `app/dependencies.py`)...
-* ... и импортируйте из него функцию `get_token_header`.
+* Ð\9dаÑ\87аÑ\82Ñ\8c Ð² Ñ\82ом Ð¶Ðµ Ð¿Ð°ÐºÐµÑ\82е, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ñ\8dÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py`) (каÑ\82алог `app/routers/`)...
+* перейти в родительский пакет (каталог `app/`)...
+* и там найти модуль `dependencies` (файл `app/dependencies.py`)...
+* и импортировать из него функцию `get_token_header`.
 
-ЭÑ\82о Ñ\80абоÑ\82аеÑ\82 Ð²ÐµÑ\80но! 🎉
+ЭÑ\82о Ñ\80абоÑ\82аеÑ\82 ÐºÐ¾Ñ\80Ñ\80екÑ\82но! 🎉
 
 ---
 
@@ -261,29 +263,29 @@ from ...dependencies import get_token_header
 
 то это бы означало:
 
-* Ð\9dаÑ\87ниÑ\82е Ñ\81 Ð¿Ð°ÐºÐµÑ\82а, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py` Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð² каталоге `app/routers/`)...
-* ... перейдите в родительский пакет (каталог `app/`)...
-* ... затем перейдите в родительский пакет текущего пакета (такого пакета не существует, `app` находится на самом верхнем уровне 😱)...
-* ... найдите в нём модуль `dependencies` (файл `app/dependencies.py`)...
-* ... и импортируйте из него функцию `get_token_header`.
+* Ð\9dаÑ\87аÑ\82Ñ\8c Ð² Ñ\82ом Ð¶Ðµ Ð¿Ð°ÐºÐµÑ\82е, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ñ\8dÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/routers/items.py`) Ñ\80аÑ\81положен Ð² (каталоге `app/routers/`)...
+* перейти в родительский пакет (каталог `app/`)...
+* затем перейти в родительский пакет этого пакета (родительского пакета нет, `app` — верхний уровень 😱)...
+* и там найти модуль `dependencies` (файл `app/dependencies.py`)...
+* и импортировать из него функцию `get_token_header`.
 
-Это будет относиться к некоторому пакету, находящемуся на один уровень выше чем `app/` и содержащему свой собственный файл `__init__.py`. Но ничего такого у нас нет. Поэтому это приведет к ошибке в нашем примере. 🚨
+Это ссылалось бы на какой-то пакет выше `app/`, со своим файлом `__init__.py` и т.п. Но у нас такого нет. Поэтому это вызвало бы ошибку в нашем примере. 🚨
 
¢ÐµÐ¿ÐµÑ\80Ñ\8c Ð²Ñ\8b Ð·Ð½Ð°ÐµÑ\82е, ÐºÐ°Ðº Ñ\80абоÑ\82аеÑ\82 Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82 Ð² Python, Ð¸ Ñ\81можеÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cное Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ование Ð² Ñ\81воиÑ\85 Ñ\81обÑ\81Ñ\82веннÑ\8bÑ\85 Ð¿Ñ\80иложениÑ\8fÑ\85 Ð»Ñ\8eбого Ñ\83Ñ\80овнÑ\8f Ñ\81ложноÑ\81Ñ\82и. 🤓
\9dо Ñ\82епеÑ\80Ñ\8c Ð²Ñ\8b Ð·Ð½Ð°ÐµÑ\82е, ÐºÐ°Ðº Ñ\8dÑ\82о Ñ\80абоÑ\82аеÑ\82, Ñ\82ак Ñ\87Ñ\82о Ð¼Ð¾Ð¶ÐµÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cнÑ\8bе Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82Ñ\8b Ð² Ñ\81воиÑ\85 Ð¿Ñ\80иложениÑ\8fÑ\85, Ð½ÐµÐ·Ð°Ð²Ð¸Ñ\81имо Ð¾Ñ\82 Ñ\82ого, Ð½Ð°Ñ\81колÑ\8cко Ð¾Ð½Ð¸ Ñ\81ложнÑ\8bе. 🤓
 
-### Добавление пользовательских тегов (`tags`), ответов (`responses`) и зависимостей (`dependencies`) { #add-some-custom-tags-responses-and-dependencies }
+### Добавление пользовательских `tags`, `responses` и `dependencies` { #add-some-custom-tags-responses-and-dependencies }
 
\9cÑ\8b Ð½Ðµ Ð±Ñ\83дем Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c Ð¿Ñ\80еÑ\84икÑ\81 `/items` Ð¸ Ñ\81пиÑ\81ок Ñ\82егов `tags=["items"]` Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ *Ñ\8dндпоинÑ\82а*, Ñ\82.к. Ð¼Ñ\8b Ñ\83же Ð¸Ñ\85 Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e `APIRouter`.
\9cÑ\8b Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fем Ð¿Ñ\80еÑ\84икÑ\81 `/items` Ð¸ `tags=["items"]` Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¹ *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и*, Ð¿Ð¾Ñ\82омÑ\83 Ñ\87Ñ\82о Ð¼Ñ\8b Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ Ð¸Ñ\85 Ð² `APIRouter`.
 
\9dо Ð¿Ð¾Ð¼Ð¸Ð¼Ð¾ Ñ\8dÑ\82ого Ð¼Ñ\8b Ð¼Ð¾Ð¶ÐµÐ¼ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c Ð½Ð¾Ð²Ñ\8bе Ñ\82еги Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¾Ñ\82делÑ\8cного *Ñ\8dндпоинÑ\82а*, Ð° Ñ\82акже Ð½ÐµÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bе Ð¾Ñ\82веÑ\82Ñ\8b (`responses`), Ñ\85аÑ\80акÑ\82еÑ\80нÑ\8bе Ð´Ð»Ñ\8f Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ *Ñ\8dндпоинÑ\82а*:
\9dо Ð¼Ñ\8b Ð²Ñ\81Ñ\91 Ñ\80авно Ð¼Ð¾Ð¶ÐµÐ¼ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c _еÑ\89Ñ\91_ `tags`, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ñ\80именÑ\8fÑ\82Ñ\8cÑ\81Ñ\8f Ðº ÐºÐ¾Ð½ÐºÑ\80еÑ\82ной *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и*, Ð° Ñ\82акже Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bе `responses`, Ñ\81пеÑ\86иÑ\84иÑ\87нÑ\8bе Ð´Ð»Ñ\8f Ñ\8dÑ\82ой *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и*:
 
 {* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[30:31] title["app/routers/items.py"] *}
 
 /// tip | Подсказка
 
\9fоÑ\81ледний *Ñ\8dндпоинÑ\82* Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e комбинацию тегов: `["items", "custom"]`.
­Ñ\82а Ð¿Ð¾Ñ\81леднÑ\8fÑ\8f Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8f Ð¿Ñ\83Ñ\82и Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c комбинацию тегов: `["items", "custom"]`.
 
\90 Ñ\82акже Ð² ÐµÐ³Ð¾ Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86ии Ð±Ñ\83дÑ\83Ñ\82 Ñ\81одеÑ\80жаÑ\82Ñ\8cÑ\81Ñ\8f Ð¾Ð±Ð° Ð¾Ñ\82веÑ\82а: Ð¾Ð´Ð¸Ð½ Ð´Ð»Ñ\8f `404` Ð¸ Ð´Ñ\80Ñ\83гой для `403`.
\98 Ð² Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86ии Ñ\83 Ð½ÐµÑ\91 Ð±Ñ\83дÑ\83Ñ\82 Ð¾Ð±Ð° Ð¾Ñ\82веÑ\82а: Ð¾Ð´Ð¸Ð½ Ð´Ð»Ñ\8f `404` Ð¸ Ð¾Ð´Ð¸Ð½ для `403`.
 
 ///
 
@@ -293,29 +295,29 @@ from ...dependencies import get_token_header
 
 Именно сюда вы импортируете и именно здесь вы используете класс `FastAPI`.
 
-Это основной файл вашего приложения, который объединяет всё в одно целое.
+Это основной файл вашего приложения, который связывает всё воедино.
 
\98 Ñ\82епеÑ\80Ñ\8c, ÐºÐ¾Ð³Ð´Ð° Ð±Ð¾Ð»Ñ\8cÑ\88аÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð»Ð¾Ð³Ð¸ÐºÐ¸ Ð¿Ñ\80иложениÑ\8f Ñ\80азделена Ð½Ð° Ð¾Ñ\82делÑ\8cнÑ\8bе Ð¼Ð¾Ð´Ñ\83ли, Ð¾Ñ\81новной Ñ\84айл `app/main.py` Ð±Ñ\83деÑ\82 Ð´Ð¾Ñ\81Ñ\82аÑ\82оÑ\87но простым.
\98 Ñ\82ак ÐºÐ°Ðº Ð±Ð¾Ð»Ñ\8cÑ\88аÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð²Ð°Ñ\88ей Ð»Ð¾Ð³Ð¸ÐºÐ¸ Ñ\82епеÑ\80Ñ\8c Ð±Ñ\83деÑ\82 Ð½Ð°Ñ\85одиÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ð¾Ñ\82делÑ\8cнÑ\8bÑ\85 Ñ\81пеÑ\86иÑ\84иÑ\87нÑ\8bÑ\85 Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85, Ð¾Ñ\81новной Ñ\84айл Ð±Ñ\83деÑ\82 Ð´Ð¾Ð²Ð¾Ð»Ñ\8cно простым.
 
 ### Импорт `FastAPI` { #import-fastapi }
 
-Вы импортируете и создаете класс `FastAPI` как обычно.
+Вы импортируете и создаёте класс `FastAPI` как обычно.
 
\9cÑ\8b Ð´Ð°Ð¶Ðµ Ð¼Ð¾Ð¶ÐµÐ¼ Ð¾Ð±Ñ\8aÑ\8fвиÑ\82Ñ\8c [глобалÑ\8cнÑ\8bе Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и](dependencies/global-dependencies.md){.internal-link target=_blank}, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð¾Ð±Ñ\8aединенÑ\8b Ñ\81 Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82Ñ\8fми Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¾Ñ\82делÑ\8cного Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80а:
\98 Ð¼Ñ\8b Ð´Ð°Ð¶Ðµ Ð¼Ð¾Ð¶ÐµÐ¼ Ð¾Ð±Ñ\8aÑ\8fвиÑ\82Ñ\8c [глобалÑ\8cнÑ\8bе Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и](dependencies/global-dependencies.md){.internal-link target=_blank}, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð¾Ð±Ñ\8aединенÑ\8b Ñ\81 Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82Ñ\8fми Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ `APIRouter`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[1,3,7] title["app/main.py"] *}
 
 ### Импорт `APIRouter` { #import-the-apirouter }
 
-Теперь мы импортируем другие суб-модули, содержащие `APIRouter`:
+Теперь мы импортируем другие подмодули, содержащие `APIRouter`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[4:5] title["app/main.py"] *}
 
-Так как файлы `app/routers/users.py` и `app/routers/items.py` являются суб-модулями одного и того же Python-пакета `app`, то мы сможем их импортировать, воспользовавшись операцией относительного импорта `.`.
+Так как файлы `app/routers/users.py` и `app/routers/items.py` являются подмодулями, входящими в один и тот же Python-пакет `app`, мы можем использовать одну точку `.` для импорта через «относительные импорты».
 
-### Как работает импорт? { #how-the-importing-works }
+### Как работает импорт { #how-the-importing-works }
 
\94аннаÑ\8f Ñ\81Ñ\82Ñ\80ока ÐºÐ¾Ð´Ð°:
­Ñ\82оÑ\82 Ñ\84Ñ\80агменÑ\82:
 
 ```Python
 from .routers import items, users
@@ -323,15 +325,15 @@ from .routers import items, users
 
 означает:
 
-* Ð\9dаÑ\87ниÑ\82е Ñ\81 Ð¿Ð°ÐºÐµÑ\82а, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ñ\81одеÑ\80жиÑ\82Ñ\81Ñ\8f Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/main.py` Ñ\81одеÑ\80жиÑ\82Ñ\81Ñ\8f Ð² каталоге `app/`)...
-* ... найдите суб-пакет `routers` (каталог `app/routers/`)...
-* ... и из него импортируйте суб-модули `items` (файл `app/routers/items.py`) и `users` (файл `app/routers/users.py`)...
+* Ð\9dаÑ\87аÑ\82Ñ\8c Ð² Ñ\82ом Ð¶Ðµ Ð¿Ð°ÐºÐµÑ\82е, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ñ\8dÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c (Ñ\84айл `app/main.py`) Ñ\80аÑ\81положен Ð² (каталоге `app/`)...
+* найти подпакет `routers` (каталог `app/routers/`)...
+* и импортировать из него подмодули `items` (файл `app/routers/items.py`) и `users` (файл `app/routers/users.py`)...
 
-В модуле `items` содержится переменная `router` (`items.router`), та самая, которую мы создали в файле `app/routers/items.py`, она является объектом класса `APIRouter`.
+В модуле `items` будет переменная `router` (`items.router`). Это та же самая, которую мы создали в файле `app/routers/items.py`, это объект `APIRouter`.
 
-И затем мы сделаем то же самое для модуля `users`.
+И затем мы делаем то же самое для модуля `users`.
 
-Мы также могли бы импортировать и другим методом:
+Мы также могли бы импортировать их так:
 
 ```Python
 from app.routers import items, users
@@ -339,44 +341,44 @@ from app.routers import items, users
 
 /// info | Примечание
 
-Первая версия является примером относительного импорта:
+Первая версия — это «относительный импорт»:
 
 ```Python
 from .routers import items, users
 ```
 
-Вторая версия является примером абсолютного импорта:
+Вторая версия — это «абсолютный импорт»:
 
 ```Python
 from app.routers import items, users
 ```
 
£Ð·Ð½Ð°Ñ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾ Ð¿Ð°ÐºÐµÑ\82аÑ\85 Ð¸ Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85 Ð² Python Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¸Ð· <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">оÑ\84иÑ\86иалÑ\8cной Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86ии Python Ð¾ Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85</a>
§Ñ\82обÑ\8b Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾ Python-пакеÑ\82аÑ\85 Ð¸ Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85, Ð¿Ñ\80оÑ\87иÑ\82айÑ\82е <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">оÑ\84иÑ\86иалÑ\8cнÑ\83Ñ\8e Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\8e Python Ð¾ Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85</a>.
 
 ///
 
-### Избегайте конфликтов имен { #avoid-name-collisions }
+### Избегайте конфликтов имён { #avoid-name-collisions }
 
\92меÑ\81Ñ\82о Ñ\82ого Ñ\87Ñ\82обÑ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ð¿ÐµÑ\80еменнÑ\83Ñ\8e `router`, Ð¼Ñ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80Ñ\83ем Ð½ÐµÐ¿Ð¾Ñ\81Ñ\80едÑ\81Ñ\82венно Ñ\81Ñ\83б-модÑ\83лÑ\8c `items`.
\9cÑ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80Ñ\83ем Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8c `items` Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83Ñ\8e, Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\82ого Ñ\87Ñ\82обÑ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко ÐµÐ³Ð¾ Ð¿ÐµÑ\80еменнÑ\83Ñ\8e `router`.
 
\9cÑ\8b Ð´ÐµÐ»Ð°ÐµÐ¼ Ñ\8dÑ\82о Ð¿Ð¾Ñ\82омÑ\83, Ñ\87Ñ\82о Ñ\83 Ð½Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c ÐµÑ\89Ñ\91 Ð¾Ð´Ð½Ð° Ð¿ÐµÑ\80еменнаÑ\8f `router` Ð² Ñ\81Ñ\83б-модуле `users`.
­Ñ\82о Ð¿Ð¾Ñ\82омÑ\83, Ñ\87Ñ\82о Ñ\83 Ð½Ð°Ñ\81 Ñ\82акже ÐµÑ\81Ñ\82Ñ\8c Ð´Ñ\80Ñ\83гаÑ\8f Ð¿ÐµÑ\80еменнаÑ\8f Ñ\81 Ð¸Ð¼ÐµÐ½ÐµÐ¼ `router` Ð² Ð¿Ð¾Ð´модуле `users`.
 
\95Ñ\81ли Ð±Ñ\8b Ð¼Ñ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овали Ð¸Ñ\85 Ð¾Ð´Ð½Ñ\83 Ð·Ð° Ð´Ñ\80Ñ\83гой, ÐºÐ°Ðº Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ð² Ð¿Ñ\80имеÑ\80е:
\95Ñ\81ли Ð±Ñ\8b Ð¼Ñ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овали Ð¸Ñ\85 Ð¾Ð´Ð½Ñ\83 Ð·Ð° Ð´Ñ\80Ñ\83гой, ÐºÐ°Ðº Ð·Ð´ÐµÑ\81Ñ\8c:
 
 ```Python
 from .routers.items import router
 from .routers.users import router
 ```
 
-то переменная `router` из `users` переписал бы переменную `router` из `items`, и у нас не было бы возможности использовать их одновременно.
+то `router` из `users` перезаписал бы `router` из `items`, и мы не смогли бы использовать их одновременно.
 
-Поэтому, для того чтобы использовать обе эти переменные в одном файле, мы импортировали соответствующие суб-модули:
+Поэтому, чтобы иметь возможность использовать обе в одном файле, мы импортируем подмодули напрямую:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[5] title["app/main.py"] *}
 
-### Подключение маршрутизаторов (`APIRouter`) для `users` и для `items` { #include-the-apirouters-for-users-and-items }
+### Подключение `APIRouter` для `users` и `items` { #include-the-apirouters-for-users-and-items }
 
\94авайÑ\82е Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87им Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80Ñ\8b (`router`) Ð¸Ð· Ñ\81Ñ\83б-модулей `users` и `items`:
¢ÐµÐ¿ÐµÑ\80Ñ\8c Ð´Ð°Ð²Ð°Ð¹Ñ\82е Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87им `router` Ð¸Ð· Ð¿Ð¾Ð´модулей `users` и `items`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[10:11] title["app/main.py"] *}
 
@@ -388,79 +390,78 @@ from .routers.users import router
 
 ///
 
-С помощью `app.include_router()` мы можем добавить каждый из маршрутизаторов (`APIRouter`) в основное приложение `FastAPI`.
+С помощью `app.include_router()` мы можем добавить каждый `APIRouter` в основное приложение `FastAPI`.
 
\9eн Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87иÑ\82 Ð²Ñ\81е Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82Ñ\8b Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80а Ðº Ð½Ð°Ñ\88емÑ\83 Ð¿Ñ\80иложениÑ\8e.
\9eн Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82 Ð²Ñ\81е Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82Ñ\8b Ñ\8dÑ\82ого Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80а ÐºÐ°Ðº Ñ\87аÑ\81Ñ\82Ñ\8c Ð¿Ñ\80иложениÑ\8f.
 
 /// note | Технические детали
 
-Фактически, внутри он создаст все *операции пути* для каждой операции пути объявленной в `APIRouter`.
+Фактически, внутри он создаст *операцию пути* для каждой *операции пути*, объявленной в `APIRouter`.
 
\98 Ð¿Ð¾Ð´ ÐºÐ°Ð¿Ð¾Ñ\82ом Ð²Ñ\81Ñ\91 Ð±Ñ\83деÑ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c Ñ\82ак, ÐºÐ°Ðº Ð±Ñ\83дÑ\82о Ð±Ñ\8b Ð¼Ñ\8b Ð¸Ð¼ÐµÐµÐ¼ Ð´ÐµÐ»Ð¾ Ñ\81 Ð¾Ð´Ð½Ð¸Ð¼ Ñ\84айлом Ð¿Ñ\80иложениÑ\8f.
¢Ð°Ðº Ñ\87Ñ\82о Ð¿Ð¾Ð´ ÐºÐ°Ð¿Ð¾Ñ\82ом Ð²Ñ\81Ñ\91 Ð±Ñ\83деÑ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c Ñ\82ак, ÐºÐ°Ðº Ð±Ñ\83дÑ\82о Ð²Ñ\81Ñ\91 Ð±Ñ\8bло Ð¾Ð´Ð½Ð¸Ð¼ Ð¿Ñ\80иложением.
 
 ///
 
 /// check | Заметка
 
-При подключении маршрутизаторов не стоит беспокоиться о производительности.
+При подключении маршрутизаторов не нужно беспокоиться о производительности.
 
\9eпеÑ\80аÑ\86иÑ\8f Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ениÑ\8f Ð·Ð°Ð¹Ð¼Ñ\91Ñ\82 Ð¼Ð¸ÐºÑ\80оÑ\81екÑ\83ндÑ\8b Ð¸ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82Ñ\81Ñ\8f Ñ\82олÑ\8cко Ð¿Ñ\80и Ð·Ð°Ð¿Ñ\83Ñ\81ке Ð¿Ñ\80иложениÑ\8f.
­Ñ\82о Ð·Ð°Ð¹Ð¼Ñ\91Ñ\82 Ð¼Ð¸ÐºÑ\80оÑ\81екÑ\83ндÑ\8b Ð¸ Ð¿Ñ\80оизойдÑ\91Ñ\82 Ñ\82олÑ\8cко Ð¿Ñ\80и Ñ\81Ñ\82аÑ\80Ñ\82е.
 
-Таким образом, это не повлияет на производительность. ⚡
+Так что это не повлияет на производительность. ⚡
 
 ///
 
-### Подключение `APIRouter` с пользовательскими префиксом (`prefix`), тегами (`tags`), ответами (`responses`), и зависимостями (`dependencies`) { #include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies }
+### Подключение `APIRouter` с пользовательскими `prefix`, `tags`, `responses` и `dependencies` { #include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies }
 
 Теперь давайте представим, что ваша организация передала вам файл `app/internal/admin.py`.
 
-Он содержит `APIRouter` с некоторыми *эндпоитами* администрирования, которые ваша организация использует для нескольких проектов.
+Он содержит `APIRouter` с некоторыми административными *операциями пути*, которые ваша организация использует в нескольких проектах.
 
-В данном примере это сделать очень просто. Но давайте предположим, что поскольку файл используется для нескольких проектов,
-то мы не можем модифицировать его, добавляя префиксы (`prefix`), зависимости (`dependencies`), теги (`tags`), и т.д. непосредственно в `APIRouter`:
+Для этого примера всё будет очень просто. Но допустим, что поскольку он используется совместно с другими проектами в организации, мы не можем модифицировать его и добавить `prefix`, `dependencies`, `tags` и т.д. непосредственно в `APIRouter`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/internal/admin.py hl[3] title["app/internal/admin.py"] *}
 
-Но, несмотря на это, мы хотим использовать кастомный префикс (`prefix`) для подключенного маршрутизатора (`APIRouter`), в результате чего, каждая *операция пути* будет начинаться с `/admin`. Также мы хотим защитить наш маршрутизатор с помощью зависимостей, созданных для нашего проекта. И ещё мы хотим включить теги (`tags`) и ответы (`responses`).
+Но мы всё равно хотим задать пользовательский `prefix` при подключении `APIRouter`, чтобы все его *операции пути* начинались с `/admin`, хотим защитить его с помощью `dependencies`, которые у нас уже есть для этого проекта, и хотим включить `tags` и `responses`.
 
\9cÑ\8b Ð¼Ð¾Ð¶ÐµÐ¼ Ð¿Ñ\80имениÑ\82Ñ\8c Ð²Ñ\81е Ð²Ñ\8bÑ\88епеÑ\80еÑ\87иÑ\81леннÑ\8bе Ð½Ð°Ñ\81Ñ\82Ñ\80ойки, Ð½Ðµ Ð¸Ð·Ð¼ÐµÐ½Ñ\8fÑ\8f Ð½Ð°Ñ\87алÑ\8cнÑ\8bй `APIRouter`. Ð\9dам Ð²Ñ\81его Ð»Ð¸Ñ\88Ñ\8c Ð½Ñ\83жно Ð¿ÐµÑ\80едаÑ\82Ñ\8c Ð½Ñ\83жнÑ\8bе Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ð² `app.include_router()`.
\9cÑ\8b Ð¼Ð¾Ð¶ÐµÐ¼ Ð¾Ð±Ñ\8aÑ\8fвиÑ\82Ñ\8c Ð²Ñ\81Ñ\91 Ñ\8dÑ\82о, Ð½Ðµ Ð¸Ð·Ð¼ÐµÐ½Ñ\8fÑ\8f Ð¸Ñ\81Ñ\85однÑ\8bй `APIRouter`, Ð¿ÐµÑ\80едав Ñ\8dÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ð² `app.include_router()`:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[14:17] title["app/main.py"] *}
 
-Таким образом, оригинальный `APIRouter` не будет модифицирован, и мы сможем использовать файл `app/internal/admin.py` сразу в нескольких проектах организации.
+Таким образом исходный `APIRouter` не будет модифицирован, и мы сможем использовать файл `app/internal/admin.py` сразу в нескольких проектах организации.
 
-В результате, в нашем приложении каждый *эндпоинт* модуля `admin` будет иметь:
+В результате в нашем приложении каждая из *операций пути* из модуля `admin` будет иметь:
 
 * Префикс `/admin`.
 * Тег `admin`.
 * Зависимость `get_token_header`.
 * Ответ `418`. 🍵
 
­Ñ\82о Ð±Ñ\83деÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ð¼ÐµÑ\81Ñ\82о Ð¸Ñ\81клÑ\8eÑ\87иÑ\82елÑ\8cно Ð´Ð»Ñ\8f `APIRouter` Ð² Ð½Ð°Ñ\88ем Ð¿Ñ\80иложении, Ð¸ Ð½Ðµ Ð·Ð°Ñ\82Ñ\80онеÑ\82 Ð»Ñ\8eбой Ð´Ñ\80Ñ\83гой ÐºÐ¾Ð´, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\89ий ÐµÐ³Ð¾.
\9dо Ñ\8dÑ\82о Ð¿Ð¾Ð²Ð»Ð¸Ñ\8fеÑ\82 Ñ\82олÑ\8cко Ð½Ð° Ñ\8dÑ\82оÑ\82 `APIRouter` Ð² Ð½Ð°Ñ\88ем Ð¿Ñ\80иложении, Ð° Ð½Ðµ Ð½Ð° Ð»Ñ\8eбой Ð´Ñ\80Ñ\83гой ÐºÐ¾Ð´, ÐºÐ¾Ñ\82оÑ\80Ñ\8bй ÐµÐ³Ð¾ Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82.
 
\9dапÑ\80имеÑ\80, Ð´Ñ\80Ñ\83гие Ð¿Ñ\80оекÑ\82Ñ\8b, Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82оÑ\82 Ð¶Ðµ Ñ\81амÑ\8bй `APIRouter` Ñ\81 Ð´Ñ\80Ñ\83гими Ð¼ÐµÑ\82одами аутентификации.
¢Ð°Ðº Ñ\87Ñ\82о, Ð½Ð°Ð¿Ñ\80имеÑ\80, Ð´Ñ\80Ñ\83гие Ð¿Ñ\80оекÑ\82Ñ\8b Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82оÑ\82 Ð¶Ðµ `APIRouter` Ñ\81 Ð´Ñ\80Ñ\83гим Ð¼ÐµÑ\82одом аутентификации.
 
-### Подключение отдельного *эндпоинта* { #include-a-path-operation }
+### Подключение *операции пути* { #include-a-path-operation }
 
\9cÑ\8b Ñ\82акже Ð¼Ð¾Ð¶ÐµÐ¼ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c *Ñ\8dндпоинÑ\82* Ð½ÐµÐ¿Ð¾Ñ\81Ñ\80едÑ\81Ñ\82венно Ð² Ð¾Ñ\81новное приложение `FastAPI`.
\9cÑ\8b Ñ\82акже Ð¼Ð¾Ð¶ÐµÐ¼ Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и* Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83Ñ\8e Ð² приложение `FastAPI`.
 
-Здесь мы это делаем ... просто, чтобы показать, что это возможно 🤷:
+Здесь мы делаем это... просто чтобы показать, что можем 🤷:
 
 {* ../../docs_src/bigger_applications/app_an_py39/main.py hl[21:23] title["app/main.py"] *}
 
-и это будет работать корректно вместе с другими *эндпоинтами*, добавленными с помощью `app.include_router()`.
+и это будет работать корректно вместе со всеми другими *операциями пути*, добавленными через `app.include_router()`.
 
-/// info | Ð¡Ð»Ð¾Ð¶Ð½Ñ\8bе технические детали
+/// info | Ð\9eÑ\87енÑ\8c технические детали
 
-**Примечание**: это сложная техническая деталь, которую, скорее всего, **вы можете пропустить**.
+**Примечание**: это очень техническая деталь, которую, вероятно, можно **просто пропустить**.
 
 ---
 
-Маршрутизаторы (`APIRouter`) не "монтируются" по-отдельности и не изолируются от остального приложения.
+`APIRouter` не «монтируются», они не изолированы от остального приложения.
 
-Это происходит потому, что нужно включить их *эндпоинты* в OpenAPI схему и в интерфейс пользователя.
+Это потому, что мы хотим включить их *операции пути* в OpenAPI-схему и пользовательские интерфейсы.
 
\92 Ñ\81илÑ\83 Ñ\82ого, Ñ\87Ñ\82о Ð¼Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÐ¼ Ð¸Ñ\85 Ð¸Ð·Ð¾Ð»Ð¸Ñ\80оваÑ\82Ñ\8c Ð¸ "пÑ\80имонÑ\82иÑ\80оваÑ\82Ñ\8c" Ð½ÐµÐ·Ð°Ð²Ð¸Ñ\81имо Ð¾Ñ\82 Ð¾Ñ\81Ñ\82алÑ\8cнÑ\8bÑ\85, *Ñ\8dндпоинÑ\82Ñ\8b* ÐºÐ»Ð¾Ð½Ð¸Ñ\80Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f (пеÑ\80еÑ\81оздаÑ\8eÑ\82Ñ\81Ñ\8f) Ð¸ Ð½Ðµ Ð¿Ð¾Ð´ключаются напрямую.
¢Ð°Ðº ÐºÐ°Ðº Ð¼Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÐ¼ Ð¿Ñ\80оÑ\81Ñ\82о Ð¸Ð·Ð¾Ð»Ð¸Ñ\80оваÑ\82Ñ\8c Ð¸Ñ\85 Ð¸ Â«Ñ\81монÑ\82иÑ\80оваÑ\82Ñ\8c» Ð½ÐµÐ·Ð°Ð²Ð¸Ñ\81имо Ð¾Ñ\82 Ð¾Ñ\81Ñ\82алÑ\8cного, *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и* Â«ÐºÐ»Ð¾Ð½Ð¸Ñ\80Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f» (пеÑ\80еÑ\81оздаÑ\8eÑ\82Ñ\81Ñ\8f), Ð° Ð½Ðµ Ð²ключаются напрямую.
 
 ///
 
@@ -480,24 +481,24 @@ $ fastapi dev app/main.py
 
 Откройте документацию по адресу <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
 
-Вы увидите автоматическую API документацию. Она включает в себя маршруты из суб-модулей, используя верные маршруты, префиксы и теги:
+Вы увидите автоматическую документацию API, включая пути из всех подмодулей, с использованием корректных путей (и префиксов) и корректных тегов:
 
 <img src="/img/tutorial/bigger-applications/image01.png">
 
-## Подключение существующего маршрута через новый префикс (`prefix`) { #include-the-same-router-multiple-times-with-different-prefix }
+## Подключение одного и того же маршрутизатора несколько раз с разными `prefix` { #include-the-same-router-multiple-times-with-different-prefix }
 
-Вы можете использовать `.include_router()` несколько раз с одним и тем же маршрутом, применив различные префиксы.
+Вы можете использовать `.include_router()` несколько раз с *одним и тем же* маршрутизатором, используя разные префиксы.
 
-Это может быть полезным, если нужно предоставить доступ к одному и тому же API через различные префиксы, например, `/api/v1` и `/api/latest`.
+Это может быть полезно, например, чтобы предоставить доступ к одному и тому же API с разными префиксами, например `/api/v1` и `/api/latest`.
 
-Это продвинутый способ, который вам может и не пригодится. Мы приводим его на случай, если вдруг вам это понадобится.
+Это продвинутое использование, которое вам может и не понадобиться, но оно есть на случай, если понадобится.
 
-## Ð\92клÑ\8eÑ\87ение Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80а (`APIRouter`) Ð² Ð´Ñ\80Ñ\83гой { #include-an-apirouter-in-another }
+## Ð\9fодклÑ\8eÑ\87ение `APIRouter` Ð² Ð´Ñ\80Ñ\83гой `APIRouter` { #include-an-apirouter-in-another }
 
-ТоÑ\87но Ñ\82ак Ð¶Ðµ, ÐºÐ°Ðº Ð²Ñ\8b Ð²ÐºÐ»Ñ\8eÑ\87аеÑ\82е `APIRouter` Ð² Ð¿Ñ\80иложение `FastAPI`, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82Ñ\8c `APIRouter` Ð² Ð´Ñ\80Ñ\83гой `APIRouter`:
+ТоÑ\87но Ñ\82ак Ð¶Ðµ, ÐºÐ°Ðº Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87иÑ\82Ñ\8c `APIRouter` Ðº Ð¿Ñ\80иложениÑ\8e `FastAPI`, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87иÑ\82Ñ\8c `APIRouter` Ðº Ð´Ñ\80Ñ\83гомÑ\83 `APIRouter`, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8f:
 
 ```Python
 router.include_router(other_router)
 ```
 
-УдоÑ\81Ñ\82овеÑ\80Ñ\8cÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о Ð²Ñ\8b Ñ\81делали Ñ\8dÑ\82о Ð´Ð¾ Ñ\82ого, ÐºÐ°Ðº Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87иÑ\82Ñ\8c Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80  (`router`) Ðº Ð²Ð°Ñ\88емÑ\83 `FastAPI` Ð¿Ñ\80иложениÑ\8e, Ð¸ *Ñ\8dндпоинÑ\82Ñ\8b* Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82изаÑ\82оÑ\80а `other_router` Ð±Ñ\8bли Ñ\82акже подключены.
+УбедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о Ð²Ñ\8b Ñ\81делали Ñ\8dÑ\82о Ð´Ð¾ Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ениÑ\8f `router` Ðº Ð¿Ñ\80иложениÑ\8e `FastAPI`, Ñ\87Ñ\82обÑ\8b *опеÑ\80аÑ\86ии Ð¿Ñ\83Ñ\82и* Ð¸Ð· `other_router` Ñ\82акже Ð±Ñ\8bли подключены.
index 73f4e66c76f7957686c75bf43026bd4c81b87256..4a7adb2559da19dc5bc20c81f643c17746fcd8f4 100644 (file)
@@ -2,13 +2,13 @@
 
 ## Обновление с заменой при помощи `PUT` { #update-replacing-with-put }
 
\94лÑ\8f Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f Ñ\8dлеменÑ\82а Ð¼Ð¾Ð¶Ð½Ð¾ Ð²Ð¾Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ð¾Ð¿ÐµÑ\80аÑ\86ией <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a>.
§Ñ\82обÑ\8b Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Ñ\8dлеменÑ\82, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a>.
 
 Вы можете использовать `jsonable_encoder`, чтобы преобразовать входные данные в данные, которые можно сохранить как JSON (например, в NoSQL-базе данных). Например, преобразование `datetime` в `str`.
 
 {* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
 
-`PUT` Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f Ð´Ð°Ð½Ð½Ñ\8bÑ\85, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð´Ð¾Ð»Ð¶Ð½Ñ\8b Ð¿Ð¾Ð»Ð½Ð¾Ñ\81Ñ\82Ñ\8cÑ\8e Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие Ð´Ð°Ð½Ð½Ñ\8bе.
+`PUT` используется для получения данных, которые должны заменить существующие данные.
 
 ### Предупреждение о замене { #warning-about-replacing }
 
 
 поскольку оно не включает уже сохраненный атрибут `"tax": 20.2`, входная модель примет значение по умолчанию `"tax": 10.5`.
 
-И данные будут сохранены с этим "новым" `tax`, равным `10,5`.
+И данные будут сохранены с этим «новым» `tax`, равным `10.5`.
 
 ## Частичное обновление с помощью `PATCH` { #partial-updates-with-patch }
 
-Также можно использовать <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> операцию для *частичного* обновления данных.
+Также можно использовать операцию <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> для *частичного* обновления данных.
 
 Это означает, что можно передавать только те данные, которые необходимо обновить, оставляя остальные нетронутыми.
 
 
 ### Использование параметра `exclude_unset` в Pydantic { #using-pydantics-exclude-unset-parameter }
 
\95Ñ\81ли Ð½ÐµÐ¾Ð±Ñ\85одимо Ð²Ñ\8bполниÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82иÑ\87ное Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ, Ñ\82о Ð¾Ñ\87енÑ\8c Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `exclude_unset` Ð² Ð¼ÐµÑ\82оде `.model_dump()` модели Pydantic.
\95Ñ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¿Ð¾Ð»Ñ\83Ñ\87аÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82иÑ\87нÑ\8bе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f, Ð¾Ñ\87енÑ\8c Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `exclude_unset` Ð² `.model_dump()` модели Pydantic.
 
 Например, `item.model_dump(exclude_unset=True)`.
 
-/// info | Информация
+В результате будет сгенерирован `dict`, содержащий только те данные, которые были заданы при создании модели `item`, без учета значений по умолчанию.
 
-В Pydantic v1 метод назывался `.dict()`, в Pydantic v2 он помечен как устаревший (но все еще поддерживается) и переименован в `.model_dump()`.
-
-Примеры здесь используют `.dict()` для совместимости с Pydantic v1, но если вы можете использовать Pydantic v2, лучше используйте `.model_dump()`.
-
-///
-
-В результате будет сгенерирован словарь, содержащий только те данные, которые были заданы при создании модели `item`, без учета значений по умолчанию. Затем вы можете использовать это для создания словаря только с теми данными, которые были установлены (отправлены в запросе), опуская значения по умолчанию:
+Затем вы можете использовать это для создания `dict` только с теми данными, которые были установлены (отправлены в запросе), опуская значения по умолчанию:
 
 {* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
 
 
 Теперь можно создать копию существующей модели, используя `.model_copy()`, и передать параметр `update` с `dict`, содержащим данные для обновления.
 
-/// info | Информация
-
-В Pydantic v1 метод назывался `.copy()`, в Pydantic v2 он помечен как устаревший (но все еще поддерживается) и переименован в `.model_copy()`.
-
-Примеры здесь используют `.copy()` для совместимости с Pydantic v1, но если вы можете использовать Pydantic v2, лучше используйте `.model_copy()`.
-
-///
-
 Например, `stored_item_model.model_copy(update=update_data)`:
 
 {* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
@@ -84,9 +70,9 @@
 
 * (Опционально) использовать `PATCH` вместо `PUT`.
 * Извлечь сохранённые данные.
-* Поместить эти данные в Pydantic модель.
+* Поместить эти данные в Pydantic-модель.
 * Сгенерировать `dict` без значений по умолчанию из входной модели (с использованием `exclude_unset`).
-    * Таким образом, можно обновлять только те значения, которые действительно установлены пользователем, вместо того чтобы переопределять значения, уже сохраненные в модели по умолчанию.
+    * Таким образом, можно обновлять только те значения, которые действительно установлены пользователем, вместо того чтобы переопределять уже сохраненные значения значениями по умолчанию из вашей модели.
 * Создать копию хранимой модели, обновив ее атрибуты полученными частичными обновлениями (с помощью параметра `update`).
 * Преобразовать скопированную модель в то, что может быть сохранено в вашей БД (например, с помощью `jsonable_encoder`).
     * Это сравнимо с повторным использованием метода модели `.model_dump()`, но при этом происходит проверка (и преобразование) значений в типы данных, которые могут быть преобразованы в JSON, например, `datetime` в `str`.
@@ -97,7 +83,7 @@
 
 /// tip | Подсказка
 
­ту же технику можно использовать и для операции HTTP `PUT`.
\9dа Ñ\81амом Ð´ÐµÐ»Ðµ Ñ\8dту же технику можно использовать и для операции HTTP `PUT`.
 
 Но в приведенном примере используется `PATCH`, поскольку он был создан именно для таких случаев использования.
 
index b61f3e7a0968ec400eab1d7a8983be992b040bbb..537d7ebc9625e1bbc1894cb54ca933e3497d3020 100644 (file)
 
 {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
 
+
 Так же, как при объявлении параметров запроса: когда атрибут модели имеет значение по умолчанию, он не обязателен. Иначе он обязателен. Используйте `None`, чтобы сделать его просто необязательным.
 
-Например, модель выше описывает такой JSON "объект" (или Python `dict`):
+Например, модель выше описывает такой JSON "`object`" (или Python `dict`):
 
 ```JSON
 {
@@ -45,7 +46,7 @@
 }
 ```
 
-...так как `description` и `tax` являются необязательными (со значением по умолчанию `None`), такой JSON "объект" тоже будет корректным:
+...так как `description` и `tax` являются необязательными (со значением по умолчанию `None`), такой JSON "`object`" тоже будет корректным:
 
 ```JSON
 {
@@ -73,7 +74,7 @@
 * Передаст полученные данные в параметр `item`.
     * Поскольку внутри функции вы объявили его с типом `Item`, у вас будет поддержка со стороны редактора кода (автозавершение и т. п.) для всех атрибутов и их типов.
 * Сгенерирует определения <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> для вашей модели; вы можете использовать их и в других местах, если это имеет смысл для вашего проекта.
-* Эти схемы будут частью сгенерированной схемы OpenAPI и будут использоваться автоматической документацией <abbr title="User Interfaces  Пользовательские интерфейсы">UIs</abbr>.
+* Эти схемы будут частью сгенерированной схемы OpenAPI и будут использоваться автоматической документацией <abbr title="User Interfaces - Пользовательские интерфейсы">UIs</abbr>.
 
 ## Автоматическая документация { #automatic-docs }
 
@@ -127,14 +128,6 @@ JSON Schema ваших моделей будет частью сгенериро
 
 {* ../../docs_src/body/tutorial002_py310.py *}
 
-/// info | Информация
-
-В Pydantic v1 метод назывался `.dict()`, в Pydantic v2 он был помечен как устаревший (но всё ещё поддерживается) и переименован в `.model_dump()`.
-
-Примеры здесь используют `.dict()` для совместимости с Pydantic v1, но если вы можете использовать Pydantic v2, используйте `.model_dump()`.
-
-///
-
 ## Тело запроса + параметры пути { #request-body-path-parameters }
 
 Вы можете одновременно объявить параметры пути и тело запроса.
@@ -143,6 +136,7 @@ JSON Schema ваших моделей будет частью сгенериро
 
 {* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
 
+
 ## Тело запроса + параметры пути + параметры запроса { #request-body-path-query-parameters }
 
 Вы также можете одновременно объявить параметры **тела**, **пути** и **запроса**.
@@ -153,7 +147,7 @@ JSON Schema ваших моделей будет частью сгенериро
 
 Параметры функции будут распознаны следующим образом:
 
-* Если параметр также объявлен в **пути**, он будет использоваться как параметр пути.
+* Если параметр также объявлен в **пути**, он будет использоваться как path-параметр.
 * Если параметр имеет **скалярный тип** (например, `int`, `float`, `str`, `bool` и т. п.), он будет интерпретирован как параметр **запроса**.
 * Если параметр объявлен как тип **модели Pydantic**, он будет интерпретирован как **тело** запроса.
 
@@ -161,7 +155,7 @@ JSON Schema ваших моделей будет частью сгенериро
 
 FastAPI понимает, что значение `q` не является обязательным из-за значения по умолчанию `= None`.
 
-Аннотации типов `str | None` (Python 3.10+) или `Union[str, None]` (Python 3.9+) не используются FastAPI для определения обязательности; он узнает, что параметр не обязателен, потому что у него есть значение по умолчанию `= None`.
+Аннотации типов `str | None` (Python 3.10+) или `Union` в `Union[str, None]` (Python 3.9+) не используются FastAPI для определения обязательности; он узнает, что параметр не обязателен, потому что у него есть значение по умолчанию `= None`.
 
 Но добавление аннотаций типов позволит вашему редактору кода лучше вас поддерживать и обнаруживать ошибки.
 
@@ -169,4 +163,4 @@ FastAPI понимает, что значение `q` не является об
 
 ## Без Pydantic { #without-pydantic }
 
-Если вы не хотите использовать модели Pydantic, вы также можете использовать параметры **Body**. См. раздел документации [Тело  Несколько параметров: Единичные значения в теле](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
+Если вы не хотите использовать модели Pydantic, вы также можете использовать параметры **Body**. См. раздел документации [Тело запроса - Несколько параметров: Единичные значения в теле](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
index 2f0ce4e33e4f893eadf56473b8b42056ac630a41..03156f2b4e7d79b237efb6a1142e1da8d6e0b3c0 100644 (file)
 
 {* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
 
-/// info | Информация
+### Про `**user_in.model_dump()` { #about-user-in-model-dump }
 
-В Pydantic v1 метод назывался `.dict()`, в Pydantic v2 он помечен как устаревший (но всё ещё поддерживается) и переименован в `.model_dump()`.
+#### `.model_dump()` из Pydantic { #pydantics-model-dump }
 
-В примерах здесь используется `.dict()` для совместимости с Pydantic v1, но если вы используете Pydantic v2, следует использовать `.model_dump()`.
+`user_in` — это Pydantic-модель класса `UserIn`.
 
-///
-
-### Про `**user_in.dict()` { #about-user-in-dict }
-
-#### `.dict()` из Pydantic { #pydantics-dict }
-
-`user_in` - это Pydantic-модель класса `UserIn`.
-
-У Pydantic-моделей есть метод `.dict()`, который возвращает `dict` с данными модели.
+У Pydantic-моделей есть метод `.model_dump()`, который возвращает `dict` с данными модели.
 
 Поэтому, если мы создадим Pydantic-объект `user_in` таким способом:
 
@@ -47,10 +39,10 @@ user_in = UserIn(username="john", password="secret", email="john.doe@example.com
 и затем вызовем:
 
 ```Python
-user_dict = user_in.dict()
+user_dict = user_in.model_dump()
 ```
 
\82о Ñ\82епеÑ\80Ñ\8c Ñ\83 Ð½Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c `dict` Ñ\81 Ð´Ð°Ð½Ð½Ñ\8bми Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð² Ð¿ÐµÑ\80еменной `user_dict` (Ñ\8dÑ\82о `dict` Ð²Ð¼ÐµÑ\81Ñ\82о Ð¾Ð±Ñ\8aекÑ\82а Pydantic-модели).
+то теперь у нас есть `dict` с данными в переменной `user_dict` (это `dict` вместо объекта Pydantic-модели).
 
 И если мы вызовем:
 
@@ -58,7 +50,7 @@ user_dict = user_in.dict()
 print(user_dict)
 ```
 
-мÑ\8b Ð¼Ð¾Ð¶ÐµÐ¼ Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c `dict` Ñ\81 Ñ\82акими Ð´Ð°Ð½Ð½Ñ\8bми:
+мÑ\8b Ð¿Ð¾Ð»Ñ\83Ñ\87им Python `dict` Ñ\81:
 
 ```Python
 {
@@ -71,7 +63,7 @@ print(user_dict)
 
 #### Распаковка `dict` { #unpacking-a-dict }
 
-Если мы возьмём `dict` наподобие `user_dict` и передадим его в функцию (или класс), используя `**user_dict`, Python распакует его. Он передаст ключи и значения `user_dict` напрямую как аргументы типа ключ-значение.
+Если мы возьмём `dict` наподобие `user_dict` и передадим его в функцию (или класс), используя `**user_dict`, Python его "распакует". Он передаст ключи и значения `user_dict` напрямую как аргументы типа ключ-значение.
 
 Поэтому, продолжая описанный выше пример с `user_dict`, написание такого кода:
 
@@ -79,7 +71,7 @@ print(user_dict)
 UserInDB(**user_dict)
 ```
 
\91Ñ\83деÑ\82 Ñ\80абоÑ\82аÑ\82Ñ\8c Ñ\82ак Ð¶Ðµ, ÐºÐ°Ðº Ð¿Ñ\80имеÑ\80но Ñ\82акой ÐºÐ¾Ð´:
±Ñ\83деÑ\82 Ñ\8dквиваленÑ\82но:
 
 ```Python
 UserInDB(
@@ -90,7 +82,7 @@ UserInDB(
 )
 ```
 
\98ли, ÐµÑ\81ли Ð´Ð»Ñ\8f Ð±Ð¾Ð»Ñ\8cÑ\88ей Ñ\82оÑ\87ноÑ\81Ñ\82и Ð¼Ñ\8b Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83Ñ\8e Ð¸Ñ\81полÑ\8cзÑ\83ем `user_dict` Ñ\81 Ð»Ñ\8eбÑ\8bм Ð¿Ð¾Ñ\82енÑ\86иалÑ\8cнÑ\8bм Ñ\81одеÑ\80жимÑ\8bм, Ñ\82о Ñ\8dÑ\82оÑ\82 Ð¿Ñ\80имеÑ\80 Ð±Ñ\83деÑ\82 Ð²Ñ\8bглÑ\8fдеÑ\82Ñ\8c Ñ\82ак:
\98ли, Ð±Ð¾Ð»ÐµÐµ Ñ\82оÑ\87но, ÐµÑ\81ли Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c `user_dict` Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83Ñ\8e, Ñ\81 Ð»Ñ\8eбÑ\8bм Ñ\81одеÑ\80жимÑ\8bм, ÐºÐ¾Ñ\82оÑ\80ое Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ\82 Ð¸Ð¼ÐµÑ\82Ñ\8c Ð² Ð±Ñ\83дÑ\83Ñ\89ем:
 
 ```Python
 UserInDB(
@@ -101,22 +93,22 @@ UserInDB(
 )
 ```
 
-#### Pydantic-модель из содержимого другой модели { #a-pydantic-model-from-the-contents-of-another }
+#### Pydantic-модель из содержимого другой { #a-pydantic-model-from-the-contents-of-another }
 
-Как в примере выше мы получили `user_dict` из `user_in.dict()`, этот код:
+Как в примере выше мы получили `user_dict` из `user_in.model_dump()`, этот код:
 
 ```Python
-user_dict = user_in.dict()
+user_dict = user_in.model_dump()
 UserInDB(**user_dict)
 ```
 
 будет равнозначен такому:
 
 ```Python
-UserInDB(**user_in.dict())
+UserInDB(**user_in.model_dump())
 ```
 
-...потому что `user_in.dict()` - это `dict`, и затем мы указываем, чтобы Python его "распаковал", когда передаём его в `UserInDB` и ставим перед ним `**`.
+...потому что `user_in.model_dump()` — это `dict`, и затем мы указываем, чтобы Python его "распаковал", когда передаём его в `UserInDB` с префиксом `**`.
 
 Таким образом мы получаем Pydantic-модель на основе данных из другой Pydantic-модели.
 
@@ -125,10 +117,10 @@ UserInDB(**user_in.dict())
 И затем, если мы добавим дополнительный именованный аргумент `hashed_password=hashed_password` как здесь:
 
 ```Python
-UserInDB(**user_in.dict(), hashed_password=hashed_password)
+UserInDB(**user_in.model_dump(), hashed_password=hashed_password)
 ```
 
-... то мы получим что-то подобное:
+...то в итоге получится что-то подобное:
 
 ```Python
 UserInDB(
@@ -142,13 +134,13 @@ UserInDB(
 
 /// warning | Предупреждение
 
-Вспомогательные функции `fake_password_hasher` и `fake_save_user` используются только для демонстрации возможного потока данных и, конечно, не обеспечивают настоящую безопасность.
+Вспомогательные дополнительные функции `fake_password_hasher` и `fake_save_user` используются только для демонстрации возможного потока данных и, конечно, не обеспечивают настоящую безопасность.
 
 ///
 
 ## Сократите дублирование { #reduce-duplication }
 
-Сокращение дублирования кода - это одна из главных идей **FastAPI**.
+Сокращение дублирования кода  это одна из главных идей **FastAPI**.
 
 Поскольку дублирование кода повышает риск появления багов, проблем с безопасностью, проблем десинхронизации кода (когда вы обновляете код в одном месте, но не обновляете в другом), и т.д.
 
@@ -166,7 +158,7 @@ UserInDB(
 
 ## `Union` или `anyOf` { #union-or-anyof }
 
\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð¿Ñ\80еделиÑ\82Ñ\8c Ð¾Ñ\82веÑ\82 ÐºÐ°Ðº `Union` Ð¸Ð· Ð´Ð²Ñ\83Ñ\85 Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÐµÐµ Ñ\82ипов. Ð­Ñ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о Ð¾Ñ\82веÑ\82 Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82воваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð¼Ñ\83 из них.
\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð±Ñ\8aÑ\8fвиÑ\82Ñ\8c HTTP-оÑ\82веÑ\82 ÐºÐ°Ðº `Union` Ð¸Ð· Ð´Ð²Ñ\83Ñ\85 Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÐµÐµ Ñ\82ипов. Ð­Ñ\82о Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о HTTP-оÑ\82веÑ\82 Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð»Ñ\8eбÑ\8bм из них.
 
 Он будет определён в OpenAPI как `anyOf`.
 
@@ -174,7 +166,7 @@ UserInDB(
 
 /// note | Примечание
 
-При объявлении <a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>, сначала указывайте наиболее детальные типы, затем менее детальные. В примере ниже более детальный `PlaneItem` стоит перед `CarItem` в `Union[PlaneItem, CarItem]`.
+При объявлении <a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a> сначала указывайте наиболее специфичный тип, затем менее специфичный. В примере ниже более специфичный `PlaneItem` стоит перед `CarItem` в `Union[PlaneItem, CarItem]`.
 
 ///
 
@@ -192,19 +184,19 @@ UserInDB(
 some_variable: PlaneItem | CarItem
 ```
 
\9dо ÐµÑ\81ли Ð¼Ñ\8b Ð¿Ð¾Ð¼ÐµÑ\89аем ÐµÐ³Ð¾ Ð² `response_model=PlaneItem | CarItem` мы получим ошибку, потому что Python попытается произвести **некорректную операцию** между `PlaneItem` и `CarItem` вместо того, чтобы интерпретировать это как аннотацию типа.
\9dо ÐµÑ\81ли Ð¼Ñ\8b Ð¿Ð¾Ð¼ÐµÑ\81Ñ\82им Ñ\8dÑ\82о Ð² Ð¿Ñ\80иÑ\81ваивание `response_model=PlaneItem | CarItem`, мы получим ошибку, потому что Python попытается произвести **некорректную операцию** между `PlaneItem` и `CarItem` вместо того, чтобы интерпретировать это как аннотацию типа.
 
 ## Список моделей { #list-of-models }
 
-Таким Ð¶Ðµ Ð¾Ð±Ñ\80азом Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð¿Ñ\80еделÑ\8fÑ\82Ñ\8c Ð¾Ñ\82веÑ\82Ñ\8b ÐºÐ°Ðº списки объектов.
+Таким Ð¶Ðµ Ð¾Ð±Ñ\80азом Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð±Ñ\8aÑ\8fвлÑ\8fÑ\82Ñ\8c HTTP-оÑ\82веÑ\82Ñ\8b, Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аÑ\8eÑ\89ие списки объектов.
 
-Для этого используйте `typing.List` из стандартной библиотеки Python (или просто `list` в Python 3.9 и выше):
+Для этого используйте стандартный `typing.List` в Python (или просто `list` в Python 3.9 и выше):
 
 {* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
 
 ## Ответ с произвольным `dict` { #response-with-arbitrary-dict }
 
\92Ñ\8b Ñ\82акже Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð¿Ñ\80еделиÑ\82Ñ\8c Ð¾Ñ\82веÑ\82, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8f Ð¿Ñ\80оизволÑ\8cнÑ\8bй Ð¾Ð´Ð½Ð¾Ñ\83Ñ\80овневÑ\8bй `dict` Ð¸ Ð¾Ð¿Ñ\80еделÑ\8fÑ\8f Ñ\82олÑ\8cко Ñ\82ипÑ\8b ÐºÐ»Ñ\8eÑ\87ей Ð¸ Ð·Ð½Ð°Ñ\87ений Ð±ÐµÐ· Ð¸Ñ\81полÑ\8cзованиÑ\8f Pydantic-моделей.
\92Ñ\8b Ñ\82акже Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð±Ñ\8aÑ\8fвиÑ\82Ñ\8c HTTP-оÑ\82веÑ\82, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8f Ð¾Ð±Ñ\8bÑ\87нÑ\8bй Ð¿Ñ\80оизволÑ\8cнÑ\8bй `dict`, Ð¾Ð±Ñ\8aÑ\8fвив Ñ\82олÑ\8cко Ñ\82ип ÐºÐ»Ñ\8eÑ\87ей Ð¸ Ð·Ð½Ð°Ñ\87ений, Ð±ÐµÐ· Ð¸Ñ\81полÑ\8cзованиÑ\8f Pydantic-модели.
 
 Это полезно, если вы заранее не знаете корректных названий полей/атрибутов (которые будут нужны при использовании Pydantic-модели).
 
@@ -214,6 +206,6 @@ some_variable: PlaneItem | CarItem
 
 ## Резюме { #recap }
 
\98Ñ\81полÑ\8cзÑ\83йÑ\82е Ð½ÐµÑ\81колÑ\8cко Pydantic-моделей Ð¸ Ñ\81вободно Ð¿Ñ\80именÑ\8fйÑ\82е Ð½Ð°Ñ\81ледование Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð¸Ð· Ð½Ð¸Ñ\85.
\98Ñ\81полÑ\8cзÑ\83йÑ\82е Ð½ÐµÑ\81колÑ\8cко Pydantic-моделей Ð¸ Ñ\81вободно Ð¿Ñ\80именÑ\8fйÑ\82е Ð½Ð°Ñ\81ледование Ð´Ð»Ñ\8f ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñ\81лÑ\83Ñ\87аÑ\8f.
 
-Вам не обязательно иметь единственную модель данных для каждой сущности, если эта сущность должна иметь возможность быть в разных "состояниях". Как в случае с "сущностью" пользователя, у которого есть состояния с полями `password`, `password_hash` и без пароля.
+Вам не обязательно иметь единственную модель данных для каждой сущности, если эта сущность должна иметь возможность быть в разных "состояниях". Как в случае с "сущностью" пользователя, у которого есть состояние, включающее `password`, `password_hash` и отсутствие пароля.
index 3a4ecc37dca372a3168dc4e160fa6a8bc410b230..2bc2fb22c59898cf2ad508c9d983cb412d7fbbce 100644 (file)
@@ -8,7 +8,7 @@
 
 Query-параметр `q` имеет тип `str | None`, это означает, что он имеет тип `str`, но также может быть `None`. Значение по умолчанию действительно `None`, поэтому FastAPI будет знать, что он не обязателен.
 
-/// note | Ð¢ÐµÑ\85ниÑ\87еÑ\81кие Ð´ÐµÑ\82али
+/// note | Ð\9fÑ\80имеÑ\87ание
 
 FastAPI поймёт, что значение `q` не обязательно, из‑за значения по умолчанию `= None`.
 
@@ -177,7 +177,7 @@ q: str = Query(default="rick")
 
 **Значение по умолчанию** у **параметра функции** — это **настоящее значение по умолчанию**, что более интуитивно для Python. 😌
 
-Вы можете **вызвать** эту же функцию в **других местах** без FastAPI, и она будет **работать как ожидается**. Если есть **обязательный** параметр (без значения по умолчанию), ваш **редактор кода** сообщит об ошибке, **Python** тоже пожалуется, если вы запустите её без передачи обязательного параметра.
+Вы можете **вызвать** эту же функцию в **других местах** без FastAPI, и она будет **работать как ожидается**. Если есть **обязательный** параметр (без значения по умолчанию), ваш **редактор** сообщит об ошибке, **Python** тоже пожалуется, если вы запустите её без передачи обязательного параметра.
 
 Если вы не используете `Annotated`, а применяете **(устаревший) стиль со значением по умолчанию**, то при вызове этой функции без FastAPI в **других местах** вам нужно **помнить** о том, что надо передать аргументы, чтобы всё работало корректно, иначе значения будут не такими, как вы ожидаете (например, вместо `str` будет `QueryInfo` или что-то подобное). И ни редактор, ни Python не будут ругаться при самом вызове функции — ошибка проявится лишь при операциях внутри.
 
@@ -191,7 +191,7 @@ q: str = Query(default="rick")
 
 ## Регулярные выражения { #add-regular-expressions }
 
-Вы можете определить <abbr title="Регулярное выражение (regex, regexp)  это последовательность символов, задающая шаблон поиска для строк.">регулярное выражение</abbr> `pattern`, которому должен соответствовать параметр:
+Вы можете определить <abbr title="Регулярное выражение (regex, regexp) - это последовательность символов, задающая шаблон поиска для строк.">регулярное выражение</abbr> `pattern`, которому должен соответствовать параметр:
 
 {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
 
@@ -205,20 +205,6 @@ q: str = Query(default="rick")
 
 Теперь вы знаете, что когда они понадобятся, вы сможете использовать их в **FastAPI**.
 
-### `regex` из Pydantic v1 вместо `pattern` { #pydantic-v1-regex-instead-of-pattern }
-
-До Pydantic версии 2 и до FastAPI 0.100.0 этот параметр назывался `regex`, а не `pattern`, но сейчас он устарел.
-
-Вы всё ещё можете встретить такой код:
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *}
-
-////
-
-Имейте в виду, что это устарело, и код следует обновить на использование нового параметра `pattern`. 🤓
-
 ## Значения по умолчанию { #default-values }
 
 Конечно, можно использовать и другие значения по умолчанию, не только `None`.
@@ -279,7 +265,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
 http://localhost:8000/items/?q=foo&q=bar
 ```
 
-вы получите множественные значения query-параметра `q` (`foo` и `bar`) в виде Python-`list` внутри вашей *функции обработки пути*, в *параметре функции* `q`.
+вы получите множественные значения *query-параметров* `q` (`foo` и `bar`) в виде Python-`list` внутри вашей *функции-обработчика пути*, в *параметре функции* `q`.
 
 Таким образом, ответ на этот URL будет:
 
@@ -331,7 +317,7 @@ http://localhost:8000/items/
 
 {* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
 
-/// note | Ð¢ÐµÑ\85ниÑ\87еÑ\81кие Ð´ÐµÑ\82али
+/// note | Ð\9fÑ\80имеÑ\87ание
 
 Имейте в виду, что в этом случае FastAPI не будет проверять содержимое списка.
 
@@ -345,7 +331,7 @@ http://localhost:8000/items/
 
 Эта информация будет включена в сгенерированную OpenAPI-схему и использована интерфейсами документации и внешними инструментами.
 
-/// note | Ð¢ÐµÑ\85ниÑ\87еÑ\81кие Ð´ÐµÑ\82али
+/// note | Ð\9fÑ\80имеÑ\87ание
 
 Помните, что разные инструменты могут иметь разный уровень поддержки OpenAPI.
 
@@ -415,7 +401,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
 
 ///
 
-Например, эта кастомная проверка убеждается, что ID элемента начинается с `isbn-` для номера книги <abbr title="ISBN означает International Standard Book Number – Международный стандартный книжный номер">ISBN</abbr> или с `imdb-` для ID URL фильма на <abbr title="IMDB (Internet Movie Database) — веб‑сайт с информацией о фильмах">IMDB</abbr>:
+Например, эта кастомная проверка убеждается, что ID элемента начинается с `isbn-` для номера книги <abbr title="ISBN означает International Standard Book Number - Международный стандартный книжный номер">ISBN</abbr> или с `imdb-` для ID URL фильма на <abbr title="IMDB (Internet Movie Database) - веб‑сайт с информацией о фильмах">IMDB</abbr>:
 
 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
 
@@ -455,7 +441,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
 
 Затем с `random.choice()` можно получить **случайное значение** из списка — то есть кортеж вида `(id, name)`. Это будет что‑то вроде `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
 
-После этого мы **распаковываем** эти два значения кортежа в переменные `id` и `name`.
+После этого мы **присваиваем эти два значения** кортежа переменным `id` и `name`.
 
 Так что, если пользователь не передал ID элемента, он всё равно получит случайную рекомендацию.
 
index 07308c1db291b44f0b795b424a028156704be47a..22a811cd57eeff3c4beec40d05a97b25ad6d0680 100644 (file)
@@ -6,11 +6,11 @@
 
 {* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
 
-FastAPI будет использовать этот тип ответа для:
+FastAPI будет использовать этот возвращаемый тип, чтобы:
 
-* **Ð\92алидаÑ\86ии** Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bÑ\85 Ð´Ð°Ð½Ð½Ñ\8bÑ\85.
-    * Если данные невалидны (например, отсутствует поле), это означает, что код *вашего* приложения работает некорректно и возвращает не то, что должен. В таком случае будет возвращена ошибка сервера вместо неправильных данных. Так вы и ваши клиенты можете быть уверены, что получите ожидаемые данные и ожидаемую структуру.
-* Ð\94обавлениÑ\8f **JSON Schema** для ответа в OpenAPI *операции пути*.
+* **Ð\92алидиÑ\80оваÑ\82Ñ\8c** Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bе Ð´Ð°Ð½Ð½Ñ\8bе.
+    * Если данные невалидны (например, отсутствует поле), это означает, что код *вашего* приложения работает некорректно и возвращает не то, что должен. В таком случае будет возвращена ошибка сервера вместо неправильных данных. Так вы и ваши клиенты можете быть уверены, что получите ожидаемые данные и ожидаемую структуру данных.
+* Ð\94обавиÑ\82Ñ\8c **JSON Schema** для ответа в OpenAPI *операции пути*.
     * Это будет использовано **автоматической документацией**.
     * Это также будет использовано инструментами автоматической генерации клиентского кода.
 
@@ -23,7 +23,7 @@ FastAPI будет использовать этот тип ответа для:
 
 Бывают случаи, когда вам нужно или хочется возвращать данные, которые не в точности соответствуют объявленному типу.
 
-Например, вы можете хотеть **возвращать словарь (dict)** или объект из базы данных, но **объявить его как Pydantic-модель**. Тогда Pydantic-модель выполнит документирование данных, валидацию и т.п. для объекта, который вы вернули (например, словаря или объекта из базы данных).
+Например, вы можете хотеть **возвращать словарь** или объект из базы данных, но **объявить его как Pydantic-модель**. Тогда Pydantic-модель выполнит документирование данных, валидацию и т.п. для объекта, который вы вернули (например, словаря или объекта из базы данных).
 
 Если вы добавите аннотацию возвращаемого типа, инструменты и редакторы кода начнут жаловаться (и будут правы), что функция возвращает тип (например, dict), отличный от объявленного (например, Pydantic-модель).
 
@@ -47,13 +47,13 @@ FastAPI будет использовать этот тип ответа для:
 
 `response_model` принимает тот же тип, что вы бы объявили для поля Pydantic-модели, то есть это может быть одна Pydantic-модель, а может быть, например, `list` Pydantic-моделей, как `List[Item]`.
 
-FastAPI будет использовать `response_model` для документации, валидации и т. п., а также для **конвертации и фильтрации выходных данных** к объявленному типу.
+FastAPI будет использовать этот `response_model` для документирования, валидации данных и т.п., а также для **конвертации и фильтрации выходных данных** к объявленному типу.
 
 /// tip | Совет
 
-Если у вас в редакторе кода, mypy и т. п. включены строгие проверки типов, вы можете объявить возвращаемый тип функции как `Any`.
+Если у вас в редакторе кода, mypy и т.п. включены строгие проверки типов, вы можете объявить возвращаемый тип функции как `Any`.
 
-Так Ð²Ñ\8b Ñ\81ообÑ\89иÑ\82е Ñ\80едакÑ\82оÑ\80Ñ\83, Ñ\87Ñ\82о Ð½Ð°Ð¼ÐµÑ\80енно Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82е Ñ\87Ñ\82о Ñ\83годно. Ð\9dо FastAPI Ð²Ñ\81Ñ\91 Ñ\80авно Ð²Ñ\8bполниÑ\82 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð²Ð°Ð»Ð¸Ð´Ð°Ñ\86иÑ\8e, Ñ\84илÑ\8cÑ\82Ñ\80аÑ\86иÑ\8e и т.д. с помощью `response_model`.
+Так Ð²Ñ\8b Ñ\81ообÑ\89иÑ\82е Ñ\80едакÑ\82оÑ\80Ñ\83, Ñ\87Ñ\82о Ð½Ð°Ð¼ÐµÑ\80енно Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82е Ñ\87Ñ\82о Ñ\83годно. Ð\9dо FastAPI Ð²Ñ\81Ñ\91 Ñ\80авно Ð²Ñ\8bполниÑ\82 Ð´Ð¾ÐºÑ\83менÑ\82иÑ\80ование, Ð²Ð°Ð»Ð¸Ð´Ð°Ñ\86иÑ\8e, Ñ\84илÑ\8cÑ\82Ñ\80аÑ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85 и т.д. с помощью `response_model`.
 
 ///
 
@@ -61,7 +61,7 @@ FastAPI будет использовать `response_model` для докуме
 
 Если вы объявите и возвращаемый тип, и `response_model`, приоритет будет у `response_model`, именно его использует FastAPI.
 
-Так вы можете добавить корректные аннотации типов к своим функциям, даже если фактически возвращаете тип, отличный от модели ответа, чтобы ими пользовались редактор и инструменты вроде mypy. И при этом FastAPI продолжит выполнять валидацию данных, документацию и т.д. с использованием `response_model`.
+Так Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c ÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bе Ð°Ð½Ð½Ð¾Ñ\82аÑ\86ии Ñ\82ипов Ðº Ñ\81воим Ñ\84Ñ\83нкÑ\86иÑ\8fм, Ð´Ð°Ð¶Ðµ ÐµÑ\81ли Ñ\84акÑ\82иÑ\87еÑ\81ки Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82е Ñ\82ип, Ð¾Ñ\82лиÑ\87нÑ\8bй Ð¾Ñ\82 Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð¾Ñ\82веÑ\82а, Ñ\87Ñ\82обÑ\8b Ð¸Ð¼Ð¸ Ð¿Ð¾Ð»Ñ\8cзовалиÑ\81Ñ\8c Ñ\80едакÑ\82оÑ\80 ÐºÐ¾Ð´Ð° Ð¸ Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b Ð²Ñ\80оде mypy. Ð\98 Ð¿Ñ\80и Ñ\8dÑ\82ом FastAPI Ð¿Ñ\80одолжиÑ\82 Ð²Ñ\8bполнÑ\8fÑ\82Ñ\8c Ð²Ð°Ð»Ð¸Ð´Ð°Ñ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\8e Ð¸ Ñ\82.д. Ñ\81 Ð¸Ñ\81полÑ\8cзованием `response_model`.
 
 Вы также можете указать `response_model=None`, чтобы отключить создание модели ответа для данной *операции пути*. Это может понадобиться, если вы добавляете аннотации типов для вещей, не являющихся валидными полями Pydantic. Пример вы увидите ниже.
 
@@ -75,7 +75,7 @@ FastAPI будет использовать `response_model` для докуме
 
 Чтобы использовать `EmailStr`, сначала установите <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a>.
 
¡Ð¾Ð·Ð´Ð°Ð¹Ñ\82е [виÑ\80Ñ\82Ñ\83алÑ\8cное Ð¾ÐºÑ\80Ñ\83жение](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивиÑ\80Ñ\83йÑ\82е ÐµÐ³Ð¾ Ð¸ затем установите пакет, например:
£Ð±ÐµÐ´Ð¸Ñ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о Ð²Ñ\8b Ñ\81оздали [виÑ\80Ñ\82Ñ\83алÑ\8cное Ð¾ÐºÑ\80Ñ\83жение](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивиÑ\80овали ÐµÐ³Ð¾, Ð° затем установите пакет, например:
 
 ```console
 $ pip install email-validator
@@ -105,7 +105,7 @@ $ pip install "pydantic[email]"
 
 ///
 
-## Ð\94обавиÑ\82Ñ\8c Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð´Ð»Ñ\8f Ð¾Ñ\82веÑ\82а { #add-an-output-model }
+## Ð\94обавиÑ\82Ñ\8c Ð²Ñ\8bÑ\85однÑ\83Ñ\8e Ð¼Ð¾Ð´ÐµÐ»Ñ\8c { #add-an-output-model }
 
 Вместо этого мы можем создать входную модель с паролем в открытом виде и выходную модель без него:
 
@@ -123,7 +123,7 @@ $ pip install "pydantic[email]"
 
 ### `response_model` или возвращаемый тип { #response-model-or-return-type }
 
-В этом случае, поскольку две модели различаются, если бы мы аннотировали возвращаемый тип функции как `UserOut`, редактор и инструменты пожаловались бы, что мы возвращаем неверный тип, так как это разные классы.
\92 Ñ\8dÑ\82ом Ñ\81лÑ\83Ñ\87ае, Ð¿Ð¾Ñ\81колÑ\8cкÑ\83 Ð´Ð²Ðµ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\80азлиÑ\87аÑ\8eÑ\82Ñ\81Ñ\8f, ÐµÑ\81ли Ð±Ñ\8b Ð¼Ñ\8b Ð°Ð½Ð½Ð¾Ñ\82иÑ\80овали Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bй Ñ\82ип Ñ\84Ñ\83нкÑ\86ии ÐºÐ°Ðº `UserOut`, Ñ\80едакÑ\82оÑ\80 ÐºÐ¾Ð´Ð° Ð¸ Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\8b Ð¿Ð¾Ð¶Ð°Ð»Ð¾Ð²Ð°Ð»Ð¸Ñ\81Ñ\8c Ð±Ñ\8b, Ñ\87Ñ\82о Ð¼Ñ\8b Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аем Ð½ÐµÐ²ÐµÑ\80нÑ\8bй Ñ\82ип, Ñ\82ак ÐºÐ°Ðº Ñ\8dÑ\82о Ñ\80азнÑ\8bе ÐºÐ»Ð°Ñ\81Ñ\81Ñ\8b.
 
 Поэтому в этом примере мы должны объявить тип ответа в параметре `response_model`.
 
@@ -135,33 +135,33 @@ $ pip install "pydantic[email]"
 
 Мы хотим, чтобы FastAPI продолжал **фильтровать** данные с помощью модели ответа. Так что, даже если функция возвращает больше данных, в ответ будут включены только поля, объявленные в модели ответа.
 
-В предыдущем примере, поскольку классы были разными, нам пришлось использовать параметр `response_model`. Но это также означает, что мы теряем поддержку от редактора и инструментов, проверяющих возвращаемый тип функции.
\92 Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ем Ð¿Ñ\80имеÑ\80е, Ð¿Ð¾Ñ\81колÑ\8cкÑ\83 ÐºÐ»Ð°Ñ\81Ñ\81Ñ\8b Ð±Ñ\8bли Ñ\80азнÑ\8bми, Ð½Ð°Ð¼ Ð¿Ñ\80иÑ\88лоÑ\81Ñ\8c Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `response_model`. Ð\9dо Ñ\8dÑ\82о Ñ\82акже Ð¾Ð·Ð½Ð°Ñ\87аеÑ\82, Ñ\87Ñ\82о Ð¼Ñ\8b Ñ\82еÑ\80Ñ\8fем Ð¿Ð¾Ð´Ð´ÐµÑ\80жкÑ\83 Ð¾Ñ\82 Ñ\80едакÑ\82оÑ\80а ÐºÐ¾Ð´Ð° Ð¸ Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82ов, Ð¿Ñ\80овеÑ\80Ñ\8fÑ\8eÑ\89иÑ\85 Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bй Ñ\82ип Ñ\84Ñ\83нкÑ\86ии.
 
 Однако в большинстве таких случаев нам нужно лишь **отфильтровать/убрать** некоторые данные, как в этом примере.
 
-И в этих случаях мы можем использовать классы и наследование, чтобы воспользоваться **аннотациями типов** функций для лучшей поддержки в редакторе и инструментах и при этом получить **фильтрацию данных** от FastAPI.
\98 Ð² Ñ\8dÑ\82иÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85 Ð¼Ñ\8b Ð¼Ð¾Ð¶ÐµÐ¼ Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c ÐºÐ»Ð°Ñ\81Ñ\81Ñ\8b Ð¸ Ð½Ð°Ñ\81ледование, Ñ\87Ñ\82обÑ\8b Ð²Ð¾Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f **анноÑ\82аÑ\86иÑ\8fми Ñ\82ипов** Ñ\84Ñ\83нкÑ\86ий Ð´Ð»Ñ\8f Ð»Ñ\83Ñ\87Ñ\88ей Ð¿Ð¾Ð´Ð´ÐµÑ\80жки Ð² Ñ\80едакÑ\82оÑ\80е ÐºÐ¾Ð´Ð° Ð¸ Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82аÑ\85 Ð¸ Ð¿Ñ\80и Ñ\8dÑ\82ом Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c **Ñ\84илÑ\8cÑ\82Ñ\80аÑ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85** Ð¾Ñ\82 FastAPI.
 
 {* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
 
-Так мы получаем поддержку инструментов (редакторы, mypy) — код корректен с точки зрения типов — и одновременно получаем фильтрацию данных от FastAPI.
+Так мы получаем поддержку инструментов — редакторов кода и mypy, так как этот код корректен с точки зрения типов — и одновременно получаем фильтрацию данных от FastAPI.
 
 Как это работает? Давайте разберёмся. 🤓
 
 ### Аннотации типов и инструменты { #type-annotations-and-tooling }
 
-Сначала посмотрим, как это увидят редакторы, mypy и другие инструменты.
+Сначала посмотрим, как это увидят редактор кода, mypy и другие инструменты.
 
-`BaseUser` Ñ\81одеÑ\80жиÑ\82 Ð±Ð°Ð·Ð¾Ð²Ñ\8bе Ð¿Ð¾Ð»Ñ\8f. Ð\97аÑ\82ем `UserIn` Ð½Ð°Ñ\81ледÑ\83еÑ\82Ñ\81Ñ\8f Ð¾Ñ\82 `BaseUser` Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fеÑ\82 Ð¿Ð¾Ð»Ðµ `password`, Ñ\82о ÐµÑ\81Ñ\82Ñ\8c Ð¾Ð½ Ð²ÐºÐ»Ñ\8eÑ\87аеÑ\82 все поля обеих моделей.
+`BaseUser` Ñ\81одеÑ\80жиÑ\82 Ð±Ð°Ð·Ð¾Ð²Ñ\8bе Ð¿Ð¾Ð»Ñ\8f. Ð\97аÑ\82ем `UserIn` Ð½Ð°Ñ\81ледÑ\83еÑ\82Ñ\81Ñ\8f Ð¾Ñ\82 `BaseUser` Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fеÑ\82 Ð¿Ð¾Ð»Ðµ `password`, Ñ\82о ÐµÑ\81Ñ\82Ñ\8c Ð¾Ð½ Ð±Ñ\83деÑ\82 Ð²ÐºÐ»Ñ\8eÑ\87аÑ\82Ñ\8c все поля обеих моделей.
 
 Мы аннотируем возвращаемый тип функции как `BaseUser`, но фактически возвращаем экземпляр `UserIn`.
 
-Редактор, mypy и другие инструменты не будут возражать, потому что с точки зрения типов `UserIn` — подкласс `BaseUser`, что означает, что это *валидный* тип везде, где ожидается что-то, являющееся `BaseUser`.
+Редактор кода, mypy и другие инструменты не будут возражать, потому что с точки зрения типов `UserIn` — подкласс `BaseUser`, что означает, что это *валидный* тип везде, где ожидается что-то, являющееся `BaseUser`.
 
 ### Фильтрация данных FastAPI { #fastapi-data-filtering }
 
-Теперь, для FastAPI: он увидит возвращаемый тип и убедится, что то, что вы возвращаете, включает **только** поля, объявленные в этом типе.
+Теперь для FastAPI: он увидит возвращаемый тип и убедится, что то, что вы возвращаете, включает **только** поля, объявленные в этом типе.
 
-FastAPI делает несколько вещей внутри вместе с Pydantic, чтобы гарантировать, что те же правила наследования классов не используются для фильтрации возвращаемых данных, иначе вы могли бы вернуть гораздо больше данных, чем ожидали.
+FastAPI делает несколько вещей внутри вместе с Pydantic, чтобы гарантировать, что те же правила наследования классов не используются для фильтрации возвращаемых данных, иначе вы могли бы в итоге вернуть намного больше данных, чем ожидали.
 
 Таким образом вы получаете лучшее из обоих миров: аннотации типов с **поддержкой инструментов** и **фильтрацию данных**.
 
@@ -171,17 +171,17 @@ FastAPI делает несколько вещей внутри вместе с
 
 <img src="/img/tutorial/response-model/image01.png">
 
\98 Ð¾Ð±Ðµ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\82ся в интерактивной документации API:
\98 Ð¾Ð±Ðµ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð±Ñ\83дÑ\83Ñ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cся в интерактивной документации API:
 
 <img src="/img/tutorial/response-model/image02.png">
 
 ## Другие аннотации возвращаемых типов { #other-return-type-annotations }
 
-Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор, mypy и т. д.).
+Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор кода, mypy и т.д.).
 
 ### Возврат Response напрямую { #return-a-response-directly }
 
-Самый распространённый случай — [возвращать Response напрямую, как описано далее в разделах для продвинутых](../advanced/response-directly.md){.internal-link target=_blank}.
+СамÑ\8bй Ñ\80аÑ\81пÑ\80оÑ\81Ñ\82Ñ\80анÑ\91ннÑ\8bй Ñ\81лÑ\83Ñ\87ай â\80\94 [возвÑ\80аÑ\89аÑ\82Ñ\8c Response Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83Ñ\8e, ÐºÐ°Ðº Ð¾Ð¿Ð¸Ñ\81ано Ð´Ð°Ð»ÐµÐµ Ð² Ñ\80азделаÑ\85 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86ии Ð´Ð»Ñ\8f Ð¿Ñ\80одвинÑ\83Ñ\82Ñ\8bÑ\85](../advanced/response-directly.md){.internal-link target=_blank}.
 
 {* ../../docs_src/response_model/tutorial003_02_py39.py hl[8,10:11] *}
 
@@ -195,7 +195,7 @@ FastAPI делает несколько вещей внутри вместе с
 
 {* ../../docs_src/response_model/tutorial003_03_py39.py hl[8:9] *}
 
-Это тоже сработает, так как `RedirectResponse` — подкласс `Response`, и FastAPI автоматически обработает этот случай.
+Это тоже сработает, так как `RedirectResponse` — подкласс `Response`, и FastAPI автоматически обработает этот простой случай.
 
 ### Некорректные аннотации возвращаемых типов { #invalid-return-type-annotations }
 
@@ -209,15 +209,15 @@ FastAPI делает несколько вещей внутри вместе с
 
 ### Отключить модель ответа { #disable-response-model }
 
\9fÑ\80одолжаÑ\8f Ð¿Ñ\80имеÑ\80 Ð²Ñ\8bÑ\88е, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ðµ Ñ\85оÑ\82еÑ\82Ñ\8c Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\83Ñ\8e Ð²Ð°Ð»Ð¸Ð´Ð°Ñ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86иÑ\8e, Ñ\84илÑ\8cÑ\82Ñ\80аÑ\86иÑ\8e Ð¸ Ñ\82.д., выполняемые FastAPI.
\9fÑ\80одолжаÑ\8f Ð¿Ñ\80имеÑ\80 Ð²Ñ\8bÑ\88е, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ðµ Ñ\85оÑ\82еÑ\82Ñ\8c Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\8bе Ð²Ð°Ð»Ð¸Ð´Ð°Ñ\86иÑ\8e Ð´Ð°Ð½Ð½Ñ\8bÑ\85, Ð´Ð¾ÐºÑ\83менÑ\82иÑ\80ование, Ñ\84илÑ\8cÑ\82Ñ\80аÑ\86иÑ\8e Ð¸ Ñ\82.п., выполняемые FastAPI.
 
-Но при этом вы можете хотеть сохранить аннотацию возвращаемого типа в функции, чтобы пользоваться поддержкой инструментов (редакторы, проверки типов вроде mypy).
+Но при этом вы можете хотеть сохранить аннотацию возвращаемого типа в функции, чтобы пользоваться поддержкой инструментов вроде редакторов кода и инструментов проверки типов (например, mypy).
 
 В этом случае вы можете отключить генерацию модели ответа, установив `response_model=None`:
 
 {* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *}
 
-Так FastAPI Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82 Ð³ÐµÐ½ÐµÑ\80аÑ\86иÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð¾Ñ\82веÑ\82а, Ð¸ Ð²Ñ\8b Ñ\81можеÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð»Ñ\8eбÑ\8bе Ð°Ð½Ð½Ð¾Ñ\82аÑ\86ии Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bÑ\85 Ñ\82ипов, Ð½Ðµ Ð²Ð»Ð¸Ñ\8fя на ваше приложение FastAPI. 🤓
+Так FastAPI Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82 Ð³ÐµÐ½ÐµÑ\80аÑ\86иÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð¾Ñ\82веÑ\82а, Ð¸ Ð²Ñ\8b Ñ\81можеÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð»Ñ\8eбÑ\8bе Ð°Ð½Ð½Ð¾Ñ\82аÑ\86ии Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аемÑ\8bÑ\85 Ñ\82ипов, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð²Ð°Ð¼ Ð½Ñ\83жнÑ\8b, Ð±ÐµÐ· Ð²Ð»Ð¸Ñ\8fния на ваше приложение FastAPI. 🤓
 
 ## Параметры кодирования модели ответа { #response-model-encoding-parameters }
 
@@ -252,20 +252,6 @@ FastAPI делает несколько вещей внутри вместе с
 
 /// info | Информация
 
-В Pydantic v1 метод назывался `.dict()`, в Pydantic v2 он был помечен как устаревший (но всё ещё поддерживается) и переименован в `.model_dump()`.
-
-Примеры здесь используют `.dict()` для совместимости с Pydantic v1, но если вы используете Pydantic v2, применяйте `.model_dump()`.
-
-///
-
-/// info | Информация
-
-FastAPI использует метод `.dict()` у Pydantic-моделей с <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">параметром `exclude_unset`</a>, чтобы добиться такого поведения.
-
-///
-
-/// info | Информация
-
 Вы также можете использовать:
 
 * `response_model_exclude_defaults=True`
@@ -312,7 +298,7 @@ FastAPI достаточно умен (на самом деле, это Pydantic
 
 Обратите внимание, что значения по умолчанию могут быть любыми, не только `None`.
 
-Это может быть список (`[]`), число с плавающей точкой `10.5` и т. д.
+Это может быть список (`[]`), число с плавающей точкой `10.5` и т.д.
 
 ///
 
@@ -346,7 +332,7 @@ FastAPI достаточно умен (на самом деле, это Pydantic
 
 #### Использование `list` вместо `set` { #using-lists-instead-of-sets }
 
-Если вы забыли использовать `set` и применили `list` или `tuple`, FastAPI всё равно преобразует это в `set`, и всё будет работать корректно:
+Если вы забыли использовать `set` и применили `list` или `tuple` вместо него, FastAPI всё равно преобразует это в `set`, и всё будет работать корректно:
 
 {* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}
 
index 5891f0d12daeabb61399efa1a9ddb372cd203c14..e4a97c88017d2468ab5c77b49fa0504da0f0f0c6 100644 (file)
@@ -8,36 +8,14 @@
 
 Вы можете объявить `examples` для модели Pydantic, которые будут добавлены в сгенерированную JSON Schema.
 
-//// tab | Pydantic v2
-
 {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
 
-////
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *}
-
-////
-
 Эта дополнительная информация будет добавлена как есть в выходную **JSON Schema** этой модели и будет использоваться в документации API.
 
-//// tab | Pydantic v2
-
-В Pydantic версии 2 вы будете использовать атрибут `model_config`, который принимает `dict`, как описано в <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Документации Pydantic: Конфигурация</a>.
+Вы можете использовать атрибут `model_config`, который принимает `dict`, как описано в <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Документации Pydantic: Конфигурация</a>.
 
 Вы можете задать `"json_schema_extra"` с `dict`, содержащим любые дополнительные данные, которые вы хотите видеть в сгенерированной JSON Schema, включая `examples`.
 
-////
-
-//// tab | Pydantic v1
-
-В Pydantic версии 1 вы будете использовать внутренний класс `Config` и `schema_extra`, как описано в <a href="https://docs.pydantic.dev/1.10/usage/schema/#schema-customization" class="external-link" target="_blank">Документации Pydantic: Настройка схемы</a>.
-
-Вы можете задать `schema_extra` со `dict`, содержащим любые дополнительные данные, которые вы хотите видеть в сгенерированной JSON Schema, включая `examples`.
-
-////
-
 /// tip | Подсказка
 
 Вы можете использовать тот же приём, чтобы расширить JSON Schema и добавить свою собственную дополнительную информацию.
@@ -124,7 +102,7 @@ OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) доб
 
 Ключи `dict` идентифицируют каждый пример, а каждое значение — это ещё один `dict`.
 
-Каждый конкретный пример`dict` в `examples` может содержать:
+Каждый конкретный пример `dict` в `examples` может содержать:
 
 * `summary`: Краткое описание примера.
 * `description`: Подробное описание, которое может содержать текст в Markdown.
@@ -135,7 +113,7 @@ OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) доб
 
 {* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
 
-### OpenAPI-примеры  в UI документации { #openapi-examples-in-the-docs-ui }
+### OpenAPI-примеры в UI документации { #openapi-examples-in-the-docs-ui }
 
 С `openapi_examples`, добавленным в `Body()`, страница `/docs` будет выглядеть так:
 
@@ -213,7 +191,7 @@ OpenAPI также добавила поля `example` и `examples` в друг
 
 ### Swagger UI и специфичные для OpenAPI `examples` { #swagger-ui-and-openapi-specific-examples }
 
 Ð°Ð½Ñ\8cÑ\88е, поскольку Swagger UI не поддерживал несколько примеров JSON Schema (по состоянию на 2023-08-26), у пользователей не было способа показать несколько примеров в документации.
¢ÐµÐ¿ÐµÑ\80Ñ\8c, поскольку Swagger UI не поддерживал несколько примеров JSON Schema (по состоянию на 2023-08-26), у пользователей не было способа показать несколько примеров в документации.
 
 Чтобы решить это, FastAPI `0.103.0` **добавил поддержку** объявления того же старого, **специфичного для OpenAPI**, поля `examples` с новым параметром `openapi_examples`. 🤓