diff --git a/docs/uk/docs/advanced/advanced-python-types.md b/docs/uk/docs/advanced/advanced-python-types.md index 9eedc48568..e4f63b83d8 100644 --- a/docs/uk/docs/advanced/advanced-python-types.md +++ b/docs/uk/docs/advanced/advanced-python-types.md @@ -13,12 +13,12 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` У `typing` також є скорочення, щоб оголосити, що щось може бути `None`, - `Optional`. -Ось порада з моєї дуже «суб'єктивної» точки зору: +Ось порада з моєї дуже **суб'єктивної** точки зору: - 🚨 Уникайте використання `Optional[SomeType]` - Натомість ✨ **використовуйте `Union[SomeType, None]`** ✨. @@ -39,13 +39,13 @@ def say_hi(name: Optional[str]): print(f"Hey {name}!") ``` -Параметр `name` визначено як `Optional[str]`, але він не є необов'язковим, ви не можете викликати функцію без цього параметра: +Параметр `name` визначено як `Optional[str]`, але він **не є необов'язковим**, ви не можете викликати функцію без цього параметра: ```Python say_hi() # О ні, це викликає помилку! 😱 ``` -Параметр `name` все ще обов'язковий (не «необов'язковий»), тому що не має значення за замовчуванням. Водночас `name` приймає `None` як значення: +Параметр `name` **все ще обов'язковий** (не *необов'язковий*), тому що не має значення за замовчуванням. Водночас `name` приймає `None` як значення: ```Python say_hi(name=None) # Це працює, None припустимий 🎉 diff --git a/docs/uk/docs/advanced/async-tests.md b/docs/uk/docs/advanced/async-tests.md index 3cdcba743a..af357ddb80 100644 --- a/docs/uk/docs/advanced/async-tests.md +++ b/docs/uk/docs/advanced/async-tests.md @@ -71,7 +71,7 @@ $ uv run pytest Це еквівалентно: ```Python -response = client.get('/') +response = client.get("/") ``` ...що ми раніше використовували для надсилання запитів за допомогою `TestClient`. @@ -94,6 +94,6 @@ response = client.get('/') /// tip | Порада -Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні [MongoDB's MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. +Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні [MotorClient від MongoDB](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. /// diff --git a/docs/uk/docs/advanced/behind-a-proxy.md b/docs/uk/docs/advanced/behind-a-proxy.md index 67b382ad27..d0b21c8e17 100644 --- a/docs/uk/docs/advanced/behind-a-proxy.md +++ b/docs/uk/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ **Представник** перед вашим застосунком зазвичай встановлює деякі заголовки на льоту перед відправленням запитів до вашого **сервера**, щоб повідомити серверу, що запит було **направлено** через представника, вказати оригінальну (публічну) URL-адресу, включно з доменом, що використовується HTTPS тощо. -Програмний **сервер** (наприклад, **Uvicorn** через **FastAPI CLI**) здатний інтерпретувати ці заголовки і передавати цю інформацію вашому застосунку. +**Сервер**, запущений за допомогою `fastapi run`, здатний інтерпретувати ці заголовки і передавати цю інформацію вашому застосунку. Але з міркувань безпеки, оскільки сервер не знає, що він працює за довіреним представником, він не інтерпретуватиме ці заголовки. @@ -34,8 +34,6 @@ ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ sequenceDiagram У вас може бути представник, що додає префікс шляху до вашого застосунку. -У таких випадках ви можете використати `root_path` для конфігурації застосунку. +У таких випадках ви можете налаштувати сервер за допомогою `fastapi run --root-path`. `root_path` - це механізм, наданий специфікацією ASGI (на якій побудовано FastAPI через Starlette). @@ -117,7 +115,7 @@ sequenceDiagram {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -І представник буде **«зрізати»** **префікс шляху** на льоту перед передачею запиту серверу застосунку (ймовірно, Uvicorn через FastAPI CLI), зберігаючи переконання вашого застосунку, що його обслуговують за `/app`, тож вам не доведеться оновлювати весь код, щоб додати префікс `/api/v1`. +І представник буде **«зрізати»** **префікс шляху** на льоту перед передачею запиту серверу, зберігаючи переконання вашого застосунку, що його обслуговують за `/app`, тож вам не доведеться оновлювати весь код, щоб додати префікс `/api/v1`. Дотепер усе працювало б як зазвичай. @@ -161,7 +159,7 @@ IP `0.0.0.0` зазвичай означає, що програма слухає } ``` -У цьому прикладі «Proxy» може бути чимось на кшталт **Traefik**. А сервером буде щось на кшталт FastAPI CLI з **Uvicorn**, який запускає ваш застосунок FastAPI. +У цьому прикладі «Proxy» може бути чимось на кшталт **Traefik**. А `fastapi run` запустить сервер, на якому працює ваш застосунок FastAPI. ### Задання `root_path` { #providing-the-root-path } @@ -171,14 +169,10 @@ IP `0.0.0.0` зазвичай означає, що програма слухає ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -Якщо ви використовуєте Hypercorn, у нього також є опція `--root-path`. - /// note | Технічні деталі Специфікація ASGI визначає `root_path` для такого випадку використання. @@ -195,14 +189,12 @@ $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -Потім, якщо ви запустите Uvicorn так: +Потім, якщо ви запустите сервер так:
+
## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
@@ -360,11 +360,11 @@ def update_item(item_id: int, item: Item):
* Натисніть кнопку «Try it out», вона дозволяє заповнити параметри та безпосередньо взаємодіяти з API:
-
+
* Потім натисніть кнопку «Execute», інтерфейс користувача зв'яжеться з вашим API, надішле параметри, отримає результати та покаже їх на екрані:
-
+
### Оновлення альтернативної документації API { #alternative-api-docs-upgrade }
@@ -467,7 +467,7 @@ item: Item
...і побачите, як ваш редактор автоматично доповнюватиме атрибути та знатиме їхні типи:
-
+
Для більш повного прикладу, що включає більше можливостей, перегляньте Навчальний посібник - Посібник користувача.
@@ -483,7 +483,7 @@ item: Item
* **WebSockets**
* надзвичайно прості тести на основі HTTPX та `pytest`
* **CORS**
- * **Cookie Sessions**
+ * **Сесії на основі кукі**
* ...та більше.
### Розгортання застосунку (необовʼязково) { #deploy-your-app-optional }
@@ -544,7 +544,7 @@ FastAPI залежить від Pydantic і Starlette.
Використовується Starlette:
-* [`httpx`](https://www.python-httpx.org) - потрібно, якщо ви хочете використовувати `TestClient`.
+* [`httpx2`](https://pydantic.dev/docs/httpx2/) (або `httpx`) - використовується `TestClient`.
* [`jinja2`](https://jinja.palletsprojects.com) - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
* [`python-multipart`](https://github.com/Kludex/python-multipart) - потрібно, якщо ви хочете підтримувати форми з «парсингом» через `request.form()`.
diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md
index 51785bf06d..edd4d73b04 100644
--- a/docs/uk/docs/tutorial/bigger-applications.md
+++ b/docs/uk/docs/tutorial/bigger-applications.md
@@ -58,17 +58,17 @@ from app.routers import items
```bash
.
-├── app # «app» - це пакет Python
-│ ├── __init__.py # цей файл робить «app» «пакетом Python»
-│ ├── main.py # модуль «main», напр. import app.main
-│ ├── dependencies.py # модуль «dependencies», напр. import app.dependencies
-│ └── routers # «routers» - це «підпакет Python»
-│ │ ├── __init__.py # робить «routers» «підпакетом Python»
-│ │ ├── items.py # підмодуль «items», напр. import app.routers.items
-│ │ └── users.py # підмодуль «users», напр. import app.routers.users
-│ └── internal # «internal» - це «підпакет Python»
-│ ├── __init__.py # робить «internal» «підпакетом Python»
-│ └── admin.py # підмодуль «admin», напр. import app.internal.admin
+├── app # "app" - це пакет Python
+│ ├── __init__.py # цей файл робить "app" "пакетом Python"
+│ ├── main.py # модуль "main", напр. import app.main
+│ ├── dependencies.py # модуль "dependencies", напр. import app.dependencies
+│ └── routers # "routers" - це "підпакет Python"
+│ │ ├── __init__.py # робить "routers" "підпакетом Python"
+│ │ ├── items.py # підмодуль "items", напр. import app.routers.items
+│ │ └── users.py # підмодуль "users", напр. import app.routers.users
+│ └── internal # "internal" - це "підпакет Python"
+│ ├── __init__.py # робить "internal" "підпакетом Python"
+│ └── admin.py # підмодуль "admin", напр. import app.internal.admin
```
## `APIRouter` { #apirouter }
@@ -95,7 +95,7 @@ from app.routers import items
{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[6,11,16] title["app/routers/users.py"] *}
-Можете думати про `APIRouter` як про «міні `FastAPI`».
+Можете думати про `APIRouter` як про клас «міні `FastAPI`».
Підтримуються ті самі опції.
@@ -129,7 +129,7 @@ from app.routers import items
## Інший модуль з `APIRouter` { #another-module-with-apirouter }
-Припустімо, у вас також є кінцеві точки для обробки «items» у модулі `app/routers/items.py`.
+Припустімо, у вас також є кінцеві точки для обробки «предметів» вашого застосунку в модулі `app/routers/items.py`.
У вас є *операції шляху* для:
@@ -155,8 +155,7 @@ from app.routers import items
```Python hl_lines="1"
@router.get("/{item_id}")
-async def read_item(item_id: str):
- ...
+async def read_item(item_id: str): ...
```
...префікс не має містити кінцевий `/`.
@@ -180,7 +179,7 @@ async def read_item(item_id: str):
...як ми і планували.
-* Вони будуть позначені списком міток, що містить один рядок `"items"`.
+* Вони будуть позначені списком міток, що містить одну строку `"items"`.
* Ці «мітки» особливо корисні для автоматичної інтерактивної документації (за допомогою OpenAPI).
* Усі вони включатимуть наперед визначені `responses`.
* Для всіх цих *операцій шляху* список `dependencies` буде оцінений/виконаний перед ними.
diff --git a/docs/uk/docs/tutorial/body-fields.md b/docs/uk/docs/tutorial/body-fields.md
index 70d94f3d6e..a11cd59058 100644
--- a/docs/uk/docs/tutorial/body-fields.md
+++ b/docs/uk/docs/tutorial/body-fields.md
@@ -1,4 +1,4 @@
-# Тіло — Поля { #body-fields }
+# Тіло - Поля { #body-fields }
Так само як ви можете оголошувати додаткову валідацію та метадані в параметрах *функції операції шляху* за допомогою `Query`, `Path` та `Body`, ви можете оголошувати валідацію та метадані всередині моделей Pydantic, використовуючи `Field` від Pydantic.
@@ -43,13 +43,13 @@
## Додавання додаткової інформації { #add-extra-information }
-Ви можете оголошувати додаткову інформацію в `Field`, `Query`, `Body` тощо. І вона буде включена до згенерованої JSON Schema.
+Ви можете оголошувати додаткову інформацію за допомогою `json_schema_extra` в `Field`, `Query`, `Body` тощо. І вона буде включена до згенерованої Схеми JSON.
Ви дізнаєтеся більше про додавання додаткової інформації пізніше в документації, коли вивчатимете, як оголошувати приклади.
/// warning | Попередження
-Додаткові ключі, передані в `Field`, також будуть присутні в отриманій схемі OpenAPI для вашого застосунку.
+Додаткові ключі, передані в `json_schema_extra`, також будуть присутні в отриманій схемі OpenAPI для вашого застосунку.
Оскільки ці ключі не обов'язково є частиною специфікації OpenAPI, деякі інструменти OpenAPI, наприклад [валідатор OpenAPI](https://validator.swagger.io/), можуть не працювати з вашою згенерованою схемою.
///
@@ -58,4 +58,4 @@
Ви можете використовувати `Field` від Pydantic, щоб оголошувати додаткову валідацію та метадані для атрибутів моделі.
-Ви також можете використовувати додаткові keyword arguments, щоб передавати додаткові метадані JSON Schema.
+Ви також можете використовувати `json_schema_extra`, щоб передавати додаткові метадані Схеми JSON.
diff --git a/docs/uk/docs/tutorial/cookie-param-models.md b/docs/uk/docs/tutorial/cookie-param-models.md
index add562dfd4..c34e4112d2 100644
--- a/docs/uk/docs/tutorial/cookie-param-models.md
+++ b/docs/uk/docs/tutorial/cookie-param-models.md
@@ -1,6 +1,6 @@
-# Моделі параметрів Cookie { #cookie-parameter-models }
+# Моделі параметрів кукі { #cookie-parameter-models }
-Якщо у вас є група **cookies**, які пов'язані між собою, ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
+Якщо у вас є група **кукі**, які пов'язані між собою, ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
Це дозволить вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
@@ -16,17 +16,17 @@
///
-## Cookie з Pydantic-моделлю { #cookies-with-a-pydantic-model }
+## Кукі з Pydantic-моделлю { #cookies-with-a-pydantic-model }
-Оголосіть **cookie**-параметри, які вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
+Оголосіть параметри **кукі**, які вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
-**FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати вам Pydantic-модель, яку ви визначили.
+**FastAPI** буде **витягувати** дані для **кожного поля** з **кукі**, отриманих у запиті, і передавати вам Pydantic-модель, яку ви визначили.
## Перевірка у документації { #check-the-docs }
-Ви можете побачити визначені cookies в інтерфейсі документації за адресою `/docs`:
+Ви можете побачити визначені кукі в інтерфейсі документації за адресою `/docs`:
@@ -34,29 +34,29 @@
/// note | Примітка
-Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
+Майте на увазі, що оскільки **браузери обробляють кукі** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
-Якщо ви зайдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies у ваших *операціях шляху*.
+Якщо ви зайдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для кукі у ваших *операціях шляху*.
-Але навіть якщо ви **заповните дані** й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і ви побачите **помилку**, ніби ви не ввели жодних значень.
+Але навіть якщо ви **заповните дані** й натиснете «Execute», оскільки інтерфейс документації працює з **JavaScript**, кукі не будуть відправлені, і ви побачите **помилку**, ніби ви не ввели жодних значень.
///
-## Заборона додаткових cookie { #forbid-extra-cookies }
+## Заборона додаткових кукі { #forbid-extra-cookies }
-У деяких спеціальних випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** cookies, які хочете отримувати.
+У деяких спеціальних випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** кукі, які хочете отримувати.
-Ваш API тепер має можливість контролювати власну згоду на cookies. 🤪🍪
+Ваш API тепер має можливість контролювати власну згоду на кукі. 🤪🍪
Ви можете використовувати налаштування моделі Pydantic, щоб `forbid` будь-які `extra` поля:
{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *}
-Якщо клієнт спробує надіслати якісь **додаткові cookies**, він отримає відповідь з **помилкою**.
+Якщо клієнт спробує надіслати якісь **додаткові кукі**, він отримає відповідь з **помилкою**.
-Бідні банери cookie, які так старанно намагаються отримати вашу згоду, щоб API її відхилила. 🍪
+Бідні банери кукі, які так старанно намагаються отримати вашу згоду, щоб API її відхилила. 🍪
-Наприклад, якщо клієнт спробує надіслати cookie `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з помилкою, яка повідомить, що `santa_tracker` cookie не дозволено:
+Наприклад, якщо клієнт спробує надіслати кукі `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з **помилкою**, яка повідомить, що `santa_tracker` кукі не дозволено:
```json
{
@@ -71,6 +71,22 @@
}
```
+## Поєднання моделей параметрів { #combine-parameter-models }
+
+Ви можете поєднувати кілька моделей параметрів кукі з окремими параметрами кукі та залежностями. Дані для кожної моделі витягуються та валідуються незалежно, як пояснено для [моделей параметрів запиту](query-param-models.md#combine-parameter-models).
+
+Налаштування `extra` кожної моделі застосовується до всіх параметрів кукі, включно з оголошеними в інших моделях або залежностях. З `extra="forbid"` будь-які кукі поза цією моделлю відхиляються. З `extra="allow"` ці кукі включаються як додаткові поля моделі.
+
+## Необов'язкові моделі параметрів кукі { #optional-cookie-parameter-models }
+
+Оголосіть модель параметрів кукі з `| None` і значенням за замовчуванням `None`, щоб зробити групу необов'язковою.
+
+{* ../../docs_src/cookie_param_models/tutorial003_an_py310.py hl[15] *}
+
+Якщо не надіслано ні `theme`, ні `locale`, `preferences` має значення `None`. Якщо надіслано хоча б одне з них, FastAPI валідує модель і вимагає обидва поля.
+
+Застосовуються ті самі правила щодо значень за замовчуванням, додаткових полів і OpenAPI, що й для [необов'язкових моделей параметрів запиту](query-param-models.md#optional-query-parameter-models).
+
## Підсумок { #summary }
Ви можете використовувати **Pydantic-моделі** для оголошення **кукі** у **FastAPI**. 😎
diff --git a/docs/uk/docs/tutorial/dependencies/sub-dependencies.md b/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
index c98d917c11..3f0fa22022 100644
--- a/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
@@ -1,14 +1,14 @@
# Підзалежності { #sub-dependencies }
-Ви можете створювати залежності, які мають підзалежності.
+Ви можете створювати залежності, які мають **підзалежності**.
-Вони можуть бути настільки глибокими, наскільки потрібно.
+Вони можуть бути настільки **глибокими**, наскільки потрібно.
**FastAPI** подбає про їх розв'язання.
-## Перша залежність «dependable» { #first-dependency-dependable }
+## Перша залежність «залежний» { #first-dependency-dependable }
-Можна створити першу залежність («dependable») так:
+Можна створити першу залежність («залежний») так:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
@@ -16,15 +16,15 @@
Це досить просто (не дуже корисно), але допоможе зосередитися на тому, як працюють підзалежності.
-## Друга залежність, «dependable» і «dependant» { #second-dependency-dependable-and-dependant }
+## Друга залежність, «залежний» і «залежний» { #second-dependency-dependable-and-dependant }
-Далі ви можете створити іншу функцію залежності («dependable»), яка водночас оголошує власну залежність (тож вона також є «dependant»):
+Далі ви можете створити іншу функцію залежності («залежний»), яка водночас оголошує власну залежність (тож вона також є «залежною»):
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *}
Зосередьмося на оголошених параметрах:
-- Хоча ця функція сама є залежністю («dependable»), вона також оголошує іншу залежність (вона «залежить» від чогось).
+- Хоча ця функція сама є залежністю («залежний»), вона також оголошує іншу залежність (вона «залежить» від чогось).
- Вона залежить від `query_extractor` і присвоює значення, яке він повертає, параметру `q`.
- Вона також оголошує необов'язкове кукі `last_query` типу `str`.
- Якщо користувач не надав параметр запиту `q`, ми використовуємо останній запит, який зберегли раніше в кукі.
@@ -37,7 +37,7 @@
/// note | Примітка
-Зверніть увагу, що ми оголошуємо лише одну залежність у функції операції шляху — `query_or_cookie_extractor`.
+Зверніть увагу, що ми оголошуємо лише одну залежність у *функції операції шляху* - `query_or_cookie_extractor`.
Але **FastAPI** знатиме, що спочатку треба розв'язати `query_extractor`, щоб передати його результат у `query_or_cookie_extractor` під час виклику.
@@ -56,16 +56,18 @@ query_extractor --> query_or_cookie_extractor --> read_query
## Використання тієї ж залежності кілька разів { #using-the-same-dependency-multiple-times }
-Якщо одна з ваших залежностей оголошена кілька разів для однієї операції шляху, наприклад, кілька залежностей мають спільну підзалежність, **FastAPI** знатиме, що цю підзалежність потрібно викликати лише один раз на запит.
+Якщо одна з ваших залежностей оголошена кілька разів для однієї *операції шляху*, наприклад, кілька залежностей мають спільну підзалежність, **FastAPI** знатиме, що цю підзалежність потрібно викликати лише один раз на запит.
-І він збереже повернуте значення у «кеш» і передасть його всім «dependants», яким воно потрібне в цьому конкретному запиті, замість того щоб викликати залежність кілька разів для одного й того ж запиту.
+І він збереже повернуте значення у «кеш» і передасть його всім «залежним», яким воно потрібне в цьому конкретному запиті, замість того щоб викликати залежність кілька разів для одного й того ж запиту.
У просунутому сценарії, коли ви знаєте, що залежність має викликатися на кожному кроці (можливо, кілька разів) у межах того самого запиту замість використання «кешованого» значення, ви можете встановити параметр `use_cache=False` при використанні `Depends`:
//// tab | Python 3.10+
-```Python hl_lines="1"
-async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
+```Python hl_lines="2"
+async def needy_dependency(
+ fresh_value: Annotated[str, Depends(get_value, use_cache=False)],
+):
return {"fresh_value": fresh_value}
```
@@ -90,7 +92,7 @@ async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False
Попри всі модні терміни, система **впровадження залежностей** досить проста.
-Це просто функції, які виглядають так само, як функції операцій шляху.
+Це просто функції, які виглядають так само, як *функції операцій шляху*.
Втім вона дуже потужна і дозволяє оголошувати довільно глибоко вкладені «графи» залежностей (дерева).
diff --git a/docs/uk/docs/tutorial/extra-models.md b/docs/uk/docs/tutorial/extra-models.md
index dfeca762c5..bb888b53f4 100644
--- a/docs/uk/docs/tutorial/extra-models.md
+++ b/docs/uk/docs/tutorial/extra-models.md
@@ -54,10 +54,10 @@ print(user_dict)
```Python
{
- 'username': 'john',
- 'password': 'secret',
- 'email': 'john.doe@example.com',
- 'full_name': None,
+ "username": "john",
+ "password": "secret",
+ "email": "john.doe@example.com",
+ "full_name": None,
}
```
@@ -86,10 +86,10 @@ UserInDB(
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
)
```
@@ -124,11 +124,11 @@ UserInDB(**user_in.model_dump(), hashed_password=hashed_password)
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- hashed_password = hashed_password,
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ hashed_password=hashed_password,
)
```
diff --git a/docs/uk/docs/tutorial/header-param-models.md b/docs/uk/docs/tutorial/header-param-models.md
index dd734eaee7..933d13607b 100644
--- a/docs/uk/docs/tutorial/header-param-models.md
+++ b/docs/uk/docs/tutorial/header-param-models.md
@@ -30,7 +30,7 @@
У деяких особливих випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** заголовки, які хочете отримати.
-Ви можете використати конфігурацію моделі Pydantic, щоб `заборонити` будь-які `додаткові` поля:
+Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які додаткові (`extra`) поля:
{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
@@ -63,10 +63,30 @@
/// warning | Попередження
-Перш ніж встановлювати `convert_underscores` у значення `False`, пам’ятайте, що деякі HTTP проксі та сервери забороняють використання заголовків із підкресленнями.
+Перш ніж встановлювати `convert_underscores` у значення `False`, пам’ятайте, що деякі HTTP представники та сервери забороняють використання заголовків із підкресленнями.
///
+## Поєднати моделі параметрів { #combine-parameter-models }
+
+Ви можете поєднувати кілька моделей параметрів заголовків з окремими параметрами заголовків і залежностями. Кожна модель витягується та перевіряється незалежно, як пояснено для [моделей параметрів запиту](query-param-models.md#combine-parameter-models).
+
+Конфігурація `extra` кожної моделі застосовується до всіх параметрів заголовків, включно з тими, що оголошені в інших моделях або залежностях. З `extra="forbid"` будь-який заголовок поза цією моделлю відхиляється. З `extra="allow"` ці заголовки включаються як додаткові поля моделі.
+
+Кожна модель використовує власне налаштування `Header(convert_underscores=...)` як під час читання запиту, так і під час генерування OpenAPI. Явно задані псевдоніми полів залишаються буквальними назвами заголовків.
+
+## Необов’язкові моделі параметрів заголовків { #optional-header-parameter-models }
+
+Оголосіть модель параметрів заголовків з `| None` і значенням за замовчуванням `None`, щоб зробити групу необов’язковою.
+
+{* ../../docs_src/header_param_models/tutorial004_an_py310.py hl[15] *}
+
+Якщо не надіслано ані `x-client-name`, ані `x-client-version`, `client` має значення `None`. Якщо надіслано хоча б один із них, FastAPI перевіряє модель і вимагає обидва поля.
+
+Для значень за замовчуванням, додаткових полів і OpenAPI діють ті самі правила, що й для [необов’язкових моделей параметрів запиту](query-param-models.md#optional-query-parameter-models).
+
+Заголовки на кшталт `Host` також підпорядковуються конфігурації `extra` моделі. З `extra="allow"` вони роблять модель присутньою, навіть якщо жодне з оголошених полів не передано.
+
## Підсумок { #summary }
Ви можете використовувати **Pydantic моделі** для оголошення **заголовків** у **FastAPI**. 😎
diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md
index 8320ee8c4c..7cd7c27197 100644
--- a/docs/uk/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md
@@ -1,6 +1,6 @@
# Параметри шляху та валідація числових даних { #path-parameters-and-numeric-validations }
-Так само як ви можете оголошувати додаткові перевірки та метадані для query параметрів за допомогою `Query`, ви можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`.
+Так само як ви можете оголошувати додаткові перевірки та метадані для параметрів запиту за допомогою `Query`, ви можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`.
## Імпорт `Path` { #import-path }
@@ -28,7 +28,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
/// note | Примітка
-Параметр шляху завжди є обов’язковим, оскільки він має бути частиною шляху. Навіть якщо ви оголосите його зі значенням `None` або встановите значення за замовчуванням — це ні на що не вплине, він все одно завжди буде обов’язковим.
+Параметр шляху завжди є обов’язковим, оскільки він має бути частиною шляху URL. Додавання `None` до його типу не робить його необов’язковим. Параметр, оголошений за допомогою `Path`, не може мати значення за замовчуванням.
///
@@ -46,7 +46,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
Але вам все одно потрібно використовувати `Path` для параметра шляху `item_id`. І з певних причин ви не хочете використовувати `Annotated`.
-Python видасть помилку, якщо розмістити значення з "default" перед значенням, яке не має "default".
+Python видасть помилку, якщо розмістити значення зі «значенням за замовчуванням» перед значенням, яке не має «значення за замовчуванням».
Але ви можете змінити порядок і розмістити значення без значення за замовчуванням (параметр запиту `q`) першим.
@@ -81,7 +81,7 @@ Python видасть помилку, якщо розмістити значен
Передайте `*` як перший параметр функції.
-Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як kwargs. Навіть якщо вони не мають значення за замовчуванням.
+Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як kwargs. Навіть якщо вони не мають значення за замовчуванням.
{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
@@ -95,7 +95,7 @@ Python нічого не зробить із цією `*`, але розпізн
За допомогою `Query` і `Path` (та інших, які ви побачите пізніше) можна оголошувати числові обмеження.
-Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`.
+Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке «`g`reater than or `e`qual» (більше або дорівнює) `1`.
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py310.py hl[10] *}
@@ -114,7 +114,7 @@ Python нічого не зробить із цією `*`, але розпізн
Ось де стає важливо мати можливість оголошувати gt, а не тільки ge. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
-Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні.
+Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` - ні.
Те саме стосується lt.
@@ -122,7 +122,7 @@ Python нічого не зробить із цією `*`, але розпізн
## Підсумок { #recap }
-За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки рядків так само як у [Query параметри та валідація рядків](query-params-str-validations.md).
+За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки строк так само як у [Параметри запиту та валідація строк](query-params-str-validations.md).
Також можна оголошувати числові перевірки:
diff --git a/docs/uk/docs/tutorial/query-param-models.md b/docs/uk/docs/tutorial/query-param-models.md
index 5affc8a6c2..2a47c482f9 100644
--- a/docs/uk/docs/tutorial/query-param-models.md
+++ b/docs/uk/docs/tutorial/query-param-models.md
@@ -16,7 +16,7 @@
{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
-**FastAPI** буде **витягувати** дані для **кожного поля** з **параметрів запиту** у запиті та передавати їх у визначену вами Pydantic-модель.
+**FastAPI** буде **витягувати** дані для **кожного поля** з **параметрів запиту** у запиті та надавати Вам визначену вами Pydantic-модель.
## Перевірте документацію { #check-the-docs }
@@ -57,12 +57,48 @@ https://example.com/items/?limit=10&tool=plumbus
}
```
+## Поєднання моделей параметрів { #combine-parameter-models }
+
+Ви можете оголосити кілька моделей параметрів запиту та поєднати їх з окремими параметрами запиту або залежностями.
+
+{* ../../docs_src/query_param_models/tutorial003_an_py310.py hl[9:15,20:22] *}
+
+Параметри запиту залишаються на одному рівні.
+
+```http
+https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt
+```
+
+У строці запиту немає ключів `pagination` або `filters`. Кожна модель перевіряє параметри запиту незалежно, зі своїми значеннями за замовчуванням, валідаторами полів і валідаторами моделі. Те саме стосується моделей або окремих параметрів, оголошених у залежностях.
+
+Якщо моделі мають спільне ім’я або псевдонім параметра, кожна модель перевіряє цей параметр запиту незалежно. Використовуйте різні імена або псевдоніми для незалежних значень. OpenAPI перелічує спільний параметр один раз, як і для параметрів, спільних із залежностями, тому спільні оголошення мають описувати однаковий тип і обмеження.
+
+Конфігурація `extra` кожної моделі застосовується до всіх параметрів запиту, зокрема оголошених в інших моделях або залежностях. З `extra="forbid"` будь-який параметр поза цією моделлю відхиляється. З `extra="allow"` ці параметри включаються як додаткові дані моделі.
+
+Це також працює для моделей `Header` і `Cookie`.
+
+## Необов’язкові моделі параметрів запиту { #optional-query-parameter-models }
+
+Оголосіть модель параметрів запиту з `| None` і значенням за замовчуванням `None`, щоб зробити групу необов’язковою.
+
+{* ../../docs_src/query_param_models/tutorial004_an_py310.py hl[18] *}
+
+Якщо не надіслано ні `start`, ні `end`, значення `date_range` буде `None`. Якщо надіслано будь-який із них, FastAPI перевіряє модель і вимагає обидва поля.
+
+Використання `| None` без значення за замовчуванням залишає параметр обов’язковим.
+
+Додаткові параметри обробляються відповідно до конфігурації `extra` моделі. Ігноровані додаткові параметри не роблять модель присутньою.
+
+OpenAPI перелічує поля групи окремо та позначає їх як необов’язкові.
+
+Ви також можете оголосити необов’язкові [моделі параметрів заголовків](header-param-models.md#optional-header-parameter-models) і [моделі параметрів кукі](cookie-param-models.md#optional-cookie-parameter-models).
+
## Підсумок { #summary }
Ви можете використовувати **Pydantic-моделі** для оголошення **параметрів запиту** у **FastAPI**. 😎
/// tip | Порада
-Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення кукі та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
+Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення кукі та заголовків, але про це Ви дізнаєтеся пізніше в цьому навчальному посібнику. 🤫
///
diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md
index d745bfb221..11af2ff860 100644
--- a/docs/uk/docs/tutorial/query-params-str-validations.md
+++ b/docs/uk/docs/tutorial/query-params-str-validations.md
@@ -220,14 +220,22 @@ q: Annotated[str | None, Query(min_length=3)] = None
{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
-### Обов’язковий, може бути `None` { #required-can-be-none }
+### Обов’язкові параметри та `None` { #required-parameters-and-none }
-Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо значення дорівнює `None`.
-
-Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вкажіть значення за замовчуванням:
+Тип `str | None` допускає `None` як значення Python, але не робить параметр запиту необов’язковим. Без значення за замовчуванням параметр залишається обов’язковим:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+Значення параметрів запиту надходять як строки й не мають вбудованого представлення `None`. Надсилання `?q=None` або `?q=null` передає строки `"None"` та `"null"` відповідно. Надсилання `?q=` передає порожню строку, яка не проходить валідацію `min_length=3` у цьому прикладі.
+
+Щоб дозволити клієнтам не передавати `q` і використовувати `None` як його значення, задайте йому значення за замовчуванням `None`:
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+Тіла запитів у форматі JSON, на відміну від параметрів запиту, можуть містити явне значення `null`.
+
## Список параметрів запиту / кілька значень { #query-parameter-list-multiple-values }
Коли ви явно визначаєте параметр запиту за допомогою `Query`, ви також можете оголосити, що він має приймати список значень, або, іншими словами, кілька значень.
diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md
index d70fb1fe37..dcd6c6e0e5 100644
--- a/docs/uk/docs/tutorial/query-params.md
+++ b/docs/uk/docs/tutorial/query-params.md
@@ -107,7 +107,13 @@ http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
```
-або будь-який інший варіант написання (великі літери, перша літера велика тощо), ваша функція побачить параметр `short` зі значенням `True` типу `bool`. В іншому випадку - `False`.
+або будь-який інший варіант написання (великі літери, перша літера велика тощо), ваша функція побачить параметр `short` зі значенням `True` типу `bool`.
+
+Такі значення, як `0`, `false`, `off` і `no` (включно з варіантами регістру), перетворюються на `False`.
+
+Якщо `short` не вказано, **FastAPI** використовує його значення за замовчуванням, яке в цьому прикладі дорівнює `False`.
+
+Порожнє значення (`?short=`) або нерозпізнане значення (наприклад, `?short=maybe`) спричиняє помилку валідації `422`.
## Кілька параметрів шляху та запиту { #multiple-path-and-query-parameters }
diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md
index 818959cebd..80e1e64b09 100644
--- a/docs/uk/docs/tutorial/request-form-models.md
+++ b/docs/uk/docs/tutorial/request-form-models.md
@@ -28,6 +28,8 @@ $ uv add python-multipart
**FastAPI** **витягне** дані для **кожного поля** з **формових даних** у запиті та надасть вам Pydantic-модель, яку ви визначили.
+Для [прапорців HTML](request-forms.md#boolean-form-fields) оголошуйте булеві поля зі значенням за замовчуванням `False`.
+
## Перевірте документацію { #check-the-docs }
Ви можете перевірити це в UI документації за `/docs`:
@@ -73,6 +75,58 @@ $ uv add python-multipart
}
```
+## Поєднуйте моделі форм { #combine-form-models }
+
+Ви можете поєднувати кілька моделей форм з окремими параметрами `Form`.
+
+{* ../../docs_src/request_form_models/tutorial003_an_py310.py hl[9:14,19:21] *}
+
+Клієнт надсилає `name`, `tags` і `token` як поля форми. Кожна модель перевіряє поля форми незалежно.
+
+Конфігурація `extra` кожної моделі застосовується до всіх полів форми, зокрема полів і файлів, оголошених в інших параметрах або залежностях. З `extra="forbid"` будь-яке поле поза цією моделлю відхиляється. З `extra="allow"` ці поля включаються як додаткові поля моделі.
+
+Якщо кілька оголошень використовують однакове ім'я поля форми, кожне перевіряє значення цього поля. Використовуйте сумісні типи й обмеження для спільних полів, щоб схема OpenAPI могла описувати їх узгоджено.
+
+## Необов'язкові моделі форм { #optional-form-models }
+
+Оголосіть модель форми з `| None` і значенням за замовчуванням `None`, щоб зробити групу необов'язковою.
+
+{* ../../docs_src/request_form_models/tutorial005_an_py310.py hl[17] *}
+
+Якщо не надіслано ані `name`, ані `age`, `profile` має значення `None`. Якщо надіслано хоча б одне з них, FastAPI перевіряє модель і вимагає обидва поля. Надіслане порожнє значення також вважається наданням поля.
+
+Використання `| None` без значення за замовчуванням залишає параметр обов'язковим.
+
+Додаткові поля обробляються відповідно до конфігурації `extra` моделі. Ігноровані додаткові поля не роблять модель присутньою.
+
+Необов'язкова модель, що містить лише невстановлені прапорці, пропускається. Надішліть значення, наприклад `enabled=false`, щоб надати її явно.
+
+## Необов'язкові об'єднання моделей форм { #optional-unions-of-form-models }
+
+Ви також можете використовувати необов'язкове об'єднання моделей.
+
+{* ../../docs_src/request_form_models/tutorial006_an_py310.py hl[9:16,21] *}
+
+Якщо жодного поля форми не надіслано, `contact` має значення `None`. Надішліть `kind=person` разом із `name` або `kind=company` разом із `company_name`. Дискримінатор вибирає модель для перевірки.
+
+## Поєднуйте об'єднання моделей форм { #combine-unions-of-form-models }
+
+Ви можете поєднувати об'єднання з іншими моделями форм, окремими параметрами `Form` і параметрами `File`. Кожне об'єднання перевіряється незалежно.
+
+{* ../../docs_src/request_form_models/tutorial007_an_py310.py hl[31:35] *}
+
+Надсилайте всі поля в одній формі. Наприклад, надішліть `contact_type=person`, `name=Rick`, `notification_type=email`, `email=rick@example.com` і `token=secret`.
+
+Не надсилайте поля сповіщення, щоб залишити `notification` зі значенням `None`.
+
+## Моделі форм і файли { #form-models-and-files }
+
+Ви також можете поєднувати модель форми з [параметрами файлів](request-files.md).
+
+{* ../../docs_src/request_form_models/tutorial004_an_py310.py hl[14] *}
+
+Тут клієнт надсилає поле `name` і файл `avatar`, використовуючи `multipart/form-data`.
+
## Підсумок { #summary }
У FastAPI ви можете використовувати Pydantic-моделі для оголошення полів форми. 😎
diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md
index 16b60ea86b..b360ce6d05 100644
--- a/docs/uk/docs/tutorial/request-forms.md
+++ b/docs/uk/docs/tutorial/request-forms.md
@@ -44,6 +44,14 @@ $ uv add python-multipart
///
+## Булеві поля форми { #boolean-form-fields }
+
+Браузери пропускають невстановлені прапорці під час надсилання HTML-форм. Оголосіть булевий параметр форми зі значенням за замовчуванням `False`, щоб отримувати `False`, коли прапорець не встановлено:
+
+{* ../../docs_src/request_forms/tutorial002_an_py310.py hl[9] *}
+
+Встановлений прапорець надсилає своє значення, яке за замовчуванням дорівнює `"on"`. **FastAPI** приймає `"on"` як `True`.
+
## Про «поля форми» { #about-form-fields }
HTML-форми (``) надсилають дані на сервер у «спеціальному» кодуванні, яке відрізняється від JSON.
@@ -56,6 +64,8 @@ HTML-форми (``) надсилають дані на серве
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі.
+Ви можете використовувати `Form(media_type="multipart/form-data")`, щоб описати багаточастинну форму в OpenAPI. Під час поєднання параметрів форми або моделей достатньо встановити це для одного параметра.
+
Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до [MDN вебдокументації для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md
index 37958646d2..2ed9139442 100644
--- a/docs/uk/docs/tutorial/response-model.md
+++ b/docs/uk/docs/tutorial/response-model.md
@@ -26,7 +26,7 @@ FastAPI використовуватиме цей тип повернення,
Наприклад, ви можете захотіти **повертати словник** або об’єкт бази даних, але **оголосити його як модель Pydantic**. Таким чином модель Pydantic виконуватиме всю документацію даних, валідацію тощо для об’єкта, який ви повернули (наприклад, словника або об’єкта бази даних).
-Якщо ви додали анотацію типу повернення, інструменти та редактори скаржитимуться (коректною) помилкою, повідомляючи, що ваша функція повертає тип (наприклад, dict), який відрізняється від того, що ви оголосили (наприклад, модель Pydantic).
+Якщо ви додали анотацію типу повернення, інструменти та редактори скаржитимуться (коректною) помилкою, повідомляючи, що ваша функція повертає тип (наприклад, словник), який відрізняється від того, що ви оголосили (наприклад, модель Pydantic).
У таких випадках можна скористатися параметром *декоратора операції шляху* `response_model` замість типу повернення.
@@ -196,7 +196,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
{* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *}
-Це теж працюватиме, бо `RedirectResponse` — підклас `Response`, і FastAPI автоматично обробить цей простий випадок.
+Це теж працюватиме, бо `RedirectResponse` - підклас `Response`, і FastAPI автоматично обробить цей простий випадок.
### Некоректні анотації типу повернення { #invalid-return-type-annotations }
@@ -206,7 +206,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
-...це не працює, тому що анотація типу не є типом Pydantic і не є просто одним класом `Response` або його підкласом, це union (будь-який із двох) між `Response` і `dict`.
+...це не працює, тому що анотація типу не є типом Pydantic і не є просто одним класом `Response` або його підкласом, це об’єднання (будь-який із двох) між `Response` і `dict`.
### Вимкнути модель відповіді { #disable-response-model }
@@ -242,7 +242,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
і ці значення за замовчуванням не будуть включені у відповідь, лише значення, які фактично встановлені.
-Отже, якщо ви надішлете запит до цієї *операції шляху* для елемента з ID `foo`, відповідь (без включення значень за замовчуванням) буде:
+Отже, якщо ви надішлете запит до цієї *операції шляху* для предмета з ID `foo`, відповідь (без включення значень за замовчуванням) буде:
```JSON
{
@@ -264,8 +264,9 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
#### Дані зі значеннями для полів із типовими значеннями { #data-with-values-for-fields-with-defaults }
-Але якщо ваші дані мають значення для полів моделі з типовими значеннями, як у елемента з ID `bar`:
+Але якщо ваші дані мають значення для полів моделі з типовими значеннями, як у предмета з ID `bar`:
+
```Python hl_lines="3 5"
{
"name": "Bar",
@@ -274,13 +275,15 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
"tax": 20.2
}
```
+
вони будуть включені у відповідь.
#### Дані з тими самими значеннями, що й типові { #data-with-the-same-values-as-the-defaults }
-Якщо дані мають ті самі значення, що й типові, як у елемента з ID `baz`:
+Якщо дані мають ті самі значення, що й типові, як у предмета з ID `baz`:
+
```Python hl_lines="3 5-6"
{
"name": "Baz",
@@ -290,6 +293,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
"tags": []
}
```
+
FastAPI достатньо розумний (насправді, Pydantic достатньо розумний), щоб зрозуміти, що, хоча `description`, `tax` і `tags` мають ті самі значення, що й типові, їх було встановлено явно (а не взято як значення за замовчуванням).
@@ -299,7 +303,7 @@ FastAPI достатньо розумний (насправді, Pydantic дос
Зверніть увагу, що типові значення можуть бути будь-якими, не лише `None`.
-Це може бути list (`[]`), `float` зі значенням `10.5` тощо.
+Це може бути список (`[]`), `float` зі значенням `10.5` тощо.
///
diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md
index 7500792cce..eef7d402fe 100644
--- a/docs/uk/docs/tutorial/security/simple-oauth2.md
+++ b/docs/uk/docs/tutorial/security/simple-oauth2.md
@@ -22,19 +22,19 @@ OAuth2 визначає, що під час використання «пото
Специфікація також каже, що клієнт може надіслати інше поле форми «`scope`».
-Назва поля форми — `scope` (в однині), але насправді це довга строка зі «scopes», розділеними пробілами.
+Назва поля форми - `scope` (в однині), але насправді це довга строка зі «scopes», розділеними пробілами.
-Кожен «scope» — це просто строка (без пробілів).
+Кожен «scope» - це просто строка (без пробілів).
Їх зазвичай використовують для оголошення конкретних прав доступу, наприклад:
-* `users:read` або `users:write` — поширені приклади.
+* `users:read` або `users:write` - поширені приклади.
* `instagram_basic` використовується Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` використовується Google.
/// note | Примітка
-У OAuth2 «scope» — це просто строка, що оголошує конкретний потрібний дозвіл.
+У OAuth2 «scope» - це просто строка, що оголошує конкретний потрібний дозвіл.
Не має значення, чи містить вона інші символи на кшталт `:` або чи це URL.
@@ -54,7 +54,7 @@ OAuth2 визначає, що під час використання «пото
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
-`OAuth2PasswordRequestForm` — це клас залежності, що оголошує тіло форми з:
+`OAuth2PasswordRequestForm` - це клас залежності, що оголошує тіло форми з:
* `username`.
* `password`.
@@ -74,11 +74,11 @@ OAuth2 визначає, що під час використання «пото
/// note | Примітка
-`OAuth2PasswordRequestForm` — не спеціальний клас для **FastAPI**, як `OAuth2PasswordBearer`.
+`OAuth2PasswordRequestForm` - не спеціальний клас для **FastAPI**, як `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` робить так, що **FastAPI** знає, що це схема безпеки. Тому її додають таким чином до OpenAPI.
-Але `OAuth2PasswordRequestForm` — це просто клас залежності, який ви могли б написати самі, або ви могли б напряму оголосити параметри `Form`.
+Але `OAuth2PasswordRequestForm` - це просто клас залежності, який ви могли б написати самі, або ви могли б напряму оголосити параметри `Form`.
Оскільки це типова задача, **FastAPI** надає його безпосередньо, щоб спростити роботу.
@@ -136,11 +136,11 @@ OAuth2 визначає, що під час використання «пото
```Python
UserInDB(
- username = user_dict["username"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- disabled = user_dict["disabled"],
- hashed_password = user_dict["hashed_password"],
+ username=user_dict["username"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ disabled=user_dict["disabled"],
+ hashed_password=user_dict["hashed_password"],
)
```