-"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
+"_[...] Я дуже часто використовую **FastAPI** останнім часом. [...] Я насправді планую використовувати його для всіх **ML-сервісів моєї команди в Microsoft**. Деякі з них інтегруються до основного продукту **Windows** і деяких продуктів **Office**._"
-
Kabir Khan -
Microsoft (ref)
+
---
-"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
+"_Ми прийняли бібліотеку **FastAPI**, щоб запустити сервер **REST**, до якого можна надсилати запити для отримання **прогнозів**. [для Ludwig]_"
-
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala -
Uber (ref)
+
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala -
Uber (джерело)
---
-"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_"
+"_**Netflix** із задоволенням оголошує про випуск з відкритим кодом нашого фреймворку оркестрації **керування кризами**: **Dispatch**! [побудовано з **FastAPI**]_"
-
Kevin Glisson, Marc Vilanova, Forest Monsen -
Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen -
Netflix (джерело)
---
-"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._"
+"_Якщо хтось хоче створювати продакшн-API на Python, я дуже рекомендую **FastAPI**. Він **чудово спроєктований**, **простий у використанні** і **дуже масштабований**, він став **ключовим компонентом** у нашій стратегії розробки з пріоритетом API і забезпечує багато автоматизацій та сервісів, як-от наш Virtual TAC Engineer._"
-
Deon Pillsbury -
Cisco (ref)
+
---
@@ -239,7 +239,7 @@ async def read_item(item_id: int, q: str | None = None):
**Примітка**:
-Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про [`async` та `await` у документації](https://fastapi.tiangolo.com/uk/async/#in-a-hurry).
+Якщо ви не знаєте, перегляньте розділ _«Поспішаєте?»_ про [`async` та `await` у документації](https://fastapi.tiangolo.com/uk/async/#in-a-hurry).
@@ -412,10 +412,10 @@ item: Item
* JSON.
* Параметрів шляху.
* Параметрів запиту.
- * Cookies.
- * Headers.
- * Forms.
- * Files.
+ * Кукі.
+ * Заголовків.
+ * Форм.
+ * Файлів.
*
Перетворення вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
* Перетворення типів Python (`str`, `int`, `float`, `bool`, `list`, тощо).
* Обʼєктів `datetime`.
@@ -477,10 +477,10 @@ item: Item
**Попередження про спойлер**: навчальний посібник - посібник користувача містить:
-* Оголошення **параметрів** з інших різних місць, як-от: **headers**, **cookies**, **form fields** та **files**.
+* Оголошення **параметрів** з інших різних місць, як-от: **заголовки**, **кукі**, **поля форми** та **файли**.
* Як встановлювати **обмеження валідації** як `maximum_length` або `regex`.
* Дуже потужну і просту у використанні систему **
Впровадження залежностей**.
-* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth.
+* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **токенами JWT** та **базовою автентифікацією HTTP**.
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
* Інтеграцію **GraphQL** з [Strawberry](https://strawberry.rocks) та іншими бібліотеками.
* Багато додаткових можливостей (завдяки Starlette) як-от:
@@ -518,13 +518,13 @@ CLI автоматично визначить ваш застосунок FastAP
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
-Він забезпечує той самий **developer experience** створення застосунків на FastAPI під час їх **розгортання** у хмарі. 🎉
+Він забезпечує той самий **досвід розробника** створення застосунків на FastAPI під час їх **розгортання** у хмарі. 🎉
-FastAPI Cloud - основний спонсор і джерело фінансування open source проєктів *FastAPI and friends*. ✨
+FastAPI Cloud - основний спонсор і джерело фінансування проєктів з відкритим кодом *FastAPI and friends*. ✨
#### Розгортання в інших хмарних провайдерів { #deploy-to-other-cloud-providers }
-FastAPI - open source проєкт і базується на стандартах. Ви можете розгортати застосунки FastAPI в будь-якому хмарному провайдері, який ви оберете.
+FastAPI - проєкт з відкритим кодом і базується на стандартах. Ви можете розгортати застосунки FastAPI в будь-якому хмарному провайдері, який ви оберете.
Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути застосунки FastAPI у нього. 🤓
@@ -532,7 +532,7 @@ FastAPI - open source проєкт і базується на стандарта
Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як [одні з найшвидших доступних Python-фреймворків](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*)
-Щоб дізнатися більше, перегляньте розділ [Benchmarks](https://fastapi.tiangolo.com/uk/benchmarks/).
+Щоб дізнатися більше, перегляньте розділ [Тести продуктивності](https://fastapi.tiangolo.com/uk/benchmarks/).
## Залежності { #dependencies }
diff --git a/docs/uk/docs/project-generation.md b/docs/uk/docs/project-generation.md
index 6e3781740e..e4e825607c 100644
--- a/docs/uk/docs/project-generation.md
+++ b/docs/uk/docs/project-generation.md
@@ -1,5 +1,6 @@
# Шаблон Full Stack FastAPI { #full-stack-fastapi-template }
+
Шаблони, хоча зазвичай постачаються з певним налаштуванням, спроєктовані бути гнучкими та налаштовуваними. Це дає змогу змінювати їх і адаптувати до вимог вашого проєкту, що робить їх чудовою відправною точкою. 🏁
Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API.
diff --git a/docs/uk/docs/python-types.md b/docs/uk/docs/python-types.md
index 332d78f215..06cc67f029 100644
--- a/docs/uk/docs/python-types.md
+++ b/docs/uk/docs/python-types.md
@@ -2,7 +2,7 @@
Python підтримує додаткові «підказки типів» (також звані «анотаціями типів»).
-Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати
тип змінної.
+Ці **«підказки типів»** або анотації - це спеціальний синтаксис, що дозволяє оголошувати
тип змінної.
За допомогою оголошення типів для ваших змінних редактори та інструменти можуть надати вам кращу підтримку.
@@ -50,7 +50,7 @@ John Doe
Це буде `upper`? Чи `uppercase`? `first_uppercase`? `capitalize`?
-Тоді ви спробуєте давнього друга програміста — автозаповнення редактора коду.
+Тоді ви спробуєте давнього друга програміста - автозаповнення редактора коду.
Ви надрукуєте перший параметр функції, `first_name`, тоді крапку (`.`), а тоді натиснете `Ctrl+Space`, щоб запустити автозаповнення.
@@ -147,20 +147,20 @@ def some_function(data: Any):
print(data)
```
-### Generic типи { #generic-types }
+### Узагальнені типи { #generic-types }
Деякі типи можуть приймати «параметри типів» у квадратних дужках, щоб визначити їх внутрішні типи. Наприклад, «list строк» буде оголошений як `list[str]`.
-Ці типи, які можуть приймати параметри типів, називаються **generic типами** або **generics**.
+Ці типи, які можуть приймати параметри типів, називаються **узагальненими типами** або **дженериками**.
-Ви можете використовувати ті самі вбудовані типи як generics (з квадратними дужками та типами всередині):
+Ви можете використовувати ті самі вбудовані типи як дженерики (з квадратними дужками та типами всередині):
* `list`
* `tuple`
* `set`
* `dict`
-#### List { #list }
+#### Список { #list }
Наприклад, давайте визначимо змінну, яка буде `list` із `str`.
@@ -176,11 +176,11 @@ def some_function(data: Any):
Ці внутрішні типи в квадратних дужках називаються «параметрами типу».
-У цьому випадку `str` — це параметр типу, переданий у `list`.
+У цьому випадку `str` - це параметр типу, переданий у `list`.
///
-Це означає: «змінна `items` — це `list`, і кожен з елементів у цьому списку — `str`».
+Це означає: «змінна `items` - це `list`, і кожен з елементів у цьому списку - `str`».
Зробивши це, ваш редактор може надати підтримку навіть під час обробки елементів зі списку:
@@ -192,7 +192,7 @@ def some_function(data: Any):
І все ж редактор знає, що це `str`, і надає підтримку для цього.
-#### Tuple and Set { #tuple-and-set }
+#### Кортеж і множина { #tuple-and-set }
Ви повинні зробити те ж саме, щоб оголосити `tuple` і `set`:
@@ -200,10 +200,10 @@ def some_function(data: Any):
Це означає:
-* Змінна `items_t` — це `tuple` з 3 елементами: `int`, ще `int`, та `str`.
-* Змінна `items_s` — це `set`, і кожен його елемент має тип `bytes`.
+* Змінна `items_t` - це `tuple` з 3 елементами: `int`, ще `int`, та `str`.
+* Змінна `items_s` - це `set`, і кожен його елемент має тип `bytes`.
-#### Dict { #dict }
+#### Словник { #dict }
Щоб оголосити `dict`, вам потрібно передати 2 параметри типу, розділені комами.
@@ -215,17 +215,17 @@ def some_function(data: Any):
Це означає:
-* Змінна `prices` — це `dict`:
+* Змінна `prices` - це `dict`:
* Ключі цього `dict` мають тип `str` (скажімо, назва кожного предмета).
* Значення цього `dict` мають тип `float` (скажімо, ціна кожного предмета).
-#### Union { #union }
+#### Об’єднання { #union }
Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад `int` або `str`.
Щоб визначити це, використовуйте
вертикальну риску (`|`), щоб розділити обидва типи.
-Це називається «union», тому що змінна може бути чимось із об’єднання цих двох множин типів.
+Це називається «об’єднанням», тому що змінна може бути чимось із об’єднання цих двох множин типів.
```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
@@ -263,11 +263,11 @@ def some_function(data: Any):

-Зверніть увагу, що це означає: «`one_person` — це **екземпляр** класу `Person`».
+Зверніть увагу, що це означає: «`one_person` - це **екземпляр** класу `Person`».
-Це не означає: «`one_person` — це **клас** з назвою `Person`».
+Це не означає: «`one_person` - це **клас** з назвою `Person`».
-## Pydantic моделі { #pydantic-models }
+## Моделі Pydantic { #pydantic-models }
[Pydantic](https://docs.pydantic.dev/) — це бібліотека Python для валідації даних.
@@ -295,7 +295,7 @@ def some_function(data: Any):
## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations }
-У Python також є можливість додавати **додаткові
метадані** до цих підказок типів за допомогою `Annotated`.
+У Python також є можливість додавати **додаткові
метадані** до цих підказок типів за допомогою `Annotated`.
Ви можете імпортувати `Annotated` з `typing`.
@@ -305,7 +305,7 @@ def some_function(data: Any):
Але ви можете використати це місце в `Annotated`, щоб надати **FastAPI** додаткові метадані про те, як ви хочете, щоб ваш застосунок поводився.
-Важливо пам’ятати, що **перший *параметр типу***, який ви передаєте в `Annotated`, — це **фактичний тип**. Решта — це лише метадані для інших інструментів.
+Важливо пам’ятати, що **перший *параметр типу***, який ви передаєте в `Annotated`, - це **фактичний тип**. Решта - це лише метадані для інших інструментів.
Наразі вам просто потрібно знати, що `Annotated` існує і що це стандартний Python. 😎
@@ -335,7 +335,7 @@ def some_function(data: Any):
* **Перевірки даних**: що надходять від кожного запиту:
* Генерування **автоматичних помилок**, що повертаються клієнту, коли дані недійсні.
* **Документування** API за допомогою OpenAPI:
- * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
+ * що потім використовується автоматичними інтерактивними користувацькими інтерфейсами документації.
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md).
diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md
index db2bf11c65..85a6c66a01 100644
--- a/docs/uk/docs/tutorial/bigger-applications.md
+++ b/docs/uk/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | Порада
@@ -382,11 +382,11 @@ from .routers.users import router
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
-/// note | Технічні деталі
+/// note | Примітка
-FastAPI зберігає оригінальний `APIRouter` і його `APIRoute` активними після включення router'а до основного застосунку.
+`users.router` містить `APIRouter` всередині файлу `app/routers/users.py`.
-Це означає, що користувацькі підкласи `APIRouter` і `APIRoute` і надалі братимуть участь після включення router'а.
+А `items.router` містить `APIRouter` всередині файлу `app/routers/items.py`.
///
@@ -394,6 +394,14 @@ FastAPI зберігає оригінальний `APIRouter` і його `APIRo
Це включить усі маршрути з цього router'а як частину застосунку.
+/// note | Технічні деталі
+
+FastAPI зберігає оригінальний `APIRouter` і його `APIRoute` активними після включення router'а до основного застосунку.
+
+Це означає, що користувацькі підкласи `APIRouter` і `APIRoute` і надалі братимуть участь після включення router'а.
+
+///
+
/// tip | Порада
Вам не потрібно перейматися продуктивністю під час включення router'ів.
@@ -445,7 +453,7 @@ FastAPI зберігає оригінальний `APIRouter` і його `APIRo
/// note | Дуже технічні деталі
-Примітка: це дуже технічна деталь, яку ви, ймовірно, можете просто пропустити.
+**Примітка**: це дуже технічна деталь, яку ви, ймовірно, можете **просто пропустити**.
---
@@ -510,7 +518,7 @@ $ fastapi dev
## Включайте той самий router кілька разів з різними `prefix` { #include-the-same-router-multiple-times-with-different-prefix }
-Ви також можете використовувати `.include_router()` кілька разів з одним і тим самим router'ом, але з різними префіксами.
+Ви також можете використовувати `.include_router()` кілька разів з *тим самим* router'ом, але з різними префіксами.
Це може бути корисно, наприклад, щоб публікувати той самий API під різними префіксами, наприклад `/api/v1` і `/api/latest`.
diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md
index 6919d3e11b..c1daaf671a 100644
--- a/docs/uk/docs/tutorial/body-nested-models.md
+++ b/docs/uk/docs/tutorial/body-nested-models.md
@@ -27,17 +27,17 @@ my_list: list[str]
Використовуйте той самий стандартний синтаксис для атрибутів моделей з внутрішніми типами.
-Отже, у нашому прикладі, ми можемо зробити `tags` саме «списком рядків»:
+Отже, у нашому прикладі, ми можемо зробити `tags` саме «списком строк»:
{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
## Типи множин { #set-types }
-Але потім ми подумали, що теги не повинні повторюватися, вони, ймовірно, повинні бути унікальними рядками.
+Але потім ми подумали, що теги не повинні повторюватися, вони, ймовірно, повинні бути унікальними строками.
-І Python має спеціальний тип даних для множин унікальних елементів — це `set`.
+І Python має спеціальний тип даних для множин унікальних елементів - це `set`.
-Тому ми можемо оголосити `tags` як множину рядків:
+Тому ми можемо оголосити `tags` як множину строк:
{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
@@ -45,7 +45,7 @@ my_list: list[str]
І коли ви будете виводити ці дані, навіть якщо джерело містить дублікати, вони будуть виведені як множина унікальних елементів.
-І це буде анотовано/документовано відповідно.
+І це буде анотовано / документовано відповідно.
## Вкладені моделі { #nested-models }
@@ -69,7 +69,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
-Це означатиме, що **FastAPI** очікуватиме тіло запиту такого вигляду:
+Це означатиме, що **FastAPI** очікуватиме тіло, подібне до:
```JSON
{
@@ -85,7 +85,7 @@ my_list: list[str]
}
```
-Завдяки такій декларації у **FastAPI** ви отримуєте:
+Знову ж, лише завдяки такому оголошенню, з **FastAPI** ви отримуєте:
* Підтримку в редакторі (автозавершення тощо), навіть для вкладених моделей
* Конвертацію даних
@@ -94,23 +94,23 @@ my_list: list[str]
## Спеціальні типи та валідація { #special-types-and-validation }
-Окрім звичайних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші типи, які наслідують `str`.
+Окрім звичайних одиничних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші одиничні типи, які наслідують `str`.
Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Деякі приклади будуть у наступному розділі.
-Наприклад, у моделі `Image` є поле `url`, тому ми можемо оголосити його як `HttpUrl` від Pydantic замість `str`:
+Наприклад, оскільки в моделі `Image` є поле `url`, ми можемо оголосити його як екземпляр `HttpUrl` від Pydantic замість `str`:
{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
-Рядок буде перевірено як дійсну URL-адресу і задокументовано в JSON Schema / OpenAPI як URL.
+Строку буде перевірено як дійсну URL-адресу і задокументовано в Схемі JSON / OpenAPI як таку.
## Атрибути зі списками підмоделей { #attributes-with-lists-of-submodels }
-У Pydantic ви можете використовувати моделі як підтипи для `list`, `set` тощо:
+У Pydantic ви також можете використовувати моделі як підтипи для `list`, `set` тощо:
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
-Це означає, що **FastAPI** буде очікувати (конвертувати, валідувати, документувати тощо) JSON тіло запиту у вигляді:
+Це очікуватиме (конвертуватиме, валідуватиме, документуватиме тощо) тіло JSON у вигляді:
```JSON hl_lines="11"
{
@@ -150,61 +150,61 @@ my_list: list[str]
/// note | Примітка
-Зверніть увагу, що в моделі `Offer` є список `Item`ів, які, своєю чергою, можуть мати необов'язковий список `Image`ів.
+Зверніть увагу, що `Offer` має список `Item`ів, які, своєю чергою, мають необов'язковий список `Image`ів
///
## Тіла запитів, що складаються зі списків { #bodies-of-pure-lists }
-Якщо верхній рівень JSON тіла, яке ви очікуєте, є JSON `масивом` (у Python — `list`), ви можете оголосити тип у параметрі функції, як і в моделях Pydantic:
+Якщо значення верхнього рівня JSON тіла, яке ви очікуєте, є JSON `array` (Python `list`), ви можете оголосити тип у параметрі функції так само, як у моделях Pydantic:
```Python
images: list[Image]
```
-наприклад:
+як у:
{* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *}
## Підтримка в редакторі всюди { #editor-support-everywhere }
-Ви отримаєте підтримку в редакторі всюди.
+І ви отримаєте підтримку в редакторі всюди.
Навіть для елементів у списках:

-Ви не змогли б отримати таку підтримку в редакторі, якби працювали напряму зі `dict`, а не з моделями Pydantic.
+Ви не змогли б отримати таку підтримку в редакторі, якби працювали напряму зі `dict`, а не з моделями Pydantic.
-Але вам не потрібно турбуватися про це: вхідні dict'и автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
+Але вам також не потрібно турбуватися про них: вхідні словники автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
## Тіла з довільними `dict` { #bodies-of-arbitrary-dicts }
Ви також можете оголосити тіло як `dict` з ключами одного типу та значеннями іншого типу.
-Це корисно, якщо ви не знаєте наперед, які імена полів будуть дійсними (як у випадку з моделями Pydantic).
+Таким чином, вам не потрібно наперед знати, які імена полів/атрибутів є дійсними (як це було б у випадку з моделями Pydantic).
Це буде корисно, якщо ви хочете приймати ключі, які заздалегідь невідомі.
---
-Це також зручно, якщо ви хочете мати ключі іншого типу (наприклад, `int`).
+Інший корисний випадок - коли ви хочете мати ключі іншого типу (наприклад, `int`).
-Ось що ми розглянемо далі.
+Ось що ми розглянемо тут.
-У цьому випадку ви можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
+У цьому випадку ви можете приймати будь-який `dict`, якщо він має ключі `int` зі значеннями `float`:
{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
/// tip | Порада
-Майте на увазі, що в JSON тілі ключі можуть бути лише рядками (`str`).
+Майте на увазі, що JSON підтримує лише `str` як ключі.
-Але Pydantic автоматично конвертує дані.
+Але Pydantic має автоматичну конвертацію даних.
-Це означає, що навіть якщо клієнти вашого API надсилатимуть ключі у вигляді рядків, якщо вони містять цілі числа, Pydantic конвертує їх і проведе валідацію.
+Це означає, що навіть якщо клієнти вашого API можуть надсилати лише строки як ключі, якщо ці строки містять цілі числа, Pydantic конвертує їх і проведе валідацію.
-Тобто `dict`, який ви отримаєте як `weights`, матиме ключі типу `int` та значення типу `float`.
+І `dict`, який ви отримаєте як `weights`, фактично матиме ключі типу `int` та значення типу `float`.
///
@@ -212,10 +212,10 @@ images: list[Image]
З **FastAPI** ви маєте максимальну гнучкість завдяки моделям Pydantic, зберігаючи при цьому код простим, коротким та елегантним.
-А також отримуєте всі переваги:
+Але з усіма перевагами:
-* Підтримка в редакторі (автодоповнення всюди!)
-* Конвертація даних (парсинг/серіалізація)
+* Підтримка в редакторі (автозавершення всюди!)
+* Конвертація даних (також відома як парсинг / серіалізація)
* Валідація даних
* Документація схем
-* Автоматичне створення документації
+* Автоматична документація
diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md
index bd1a8f128f..64d9af95e3 100644
--- a/docs/uk/docs/tutorial/body.md
+++ b/docs/uk/docs/tutorial/body.md
@@ -4,7 +4,7 @@
Тіло **запиту** - це дані, надіслані клієнтом до вашого API. Тіло **відповіді** - це дані, які ваш API надсилає клієнту.
-Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** — інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
+Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** - інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами.
diff --git a/docs/uk/docs/tutorial/debugging.md b/docs/uk/docs/tutorial/debugging.md
index 821b558014..4d995698c4 100644
--- a/docs/uk/docs/tutorial/debugging.md
+++ b/docs/uk/docs/tutorial/debugging.md
@@ -1,5 +1,6 @@
# Налагодження { #debugging }
+
Ви можете під'єднати дебагер у вашому редакторі коду, наприклад, у Visual Studio Code або PyCharm.
## Виклик `uvicorn` { #call-uvicorn }
diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
index 348cbf25b8..9642cebe04 100644
--- a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -63,7 +63,7 @@ FastAPI підтримує залежності, які виконують де
Ви можете мати підзалежності та «дерева» підзалежностей будь-якого розміру і форми, і будь-яка або всі з них можуть використовувати `yield`.
-**FastAPI** гарантує, що «exit code» у кожній залежності з `yield` буде виконано в правильному порядку.
+**FastAPI** гарантує, що «код виходу» у кожній залежності з `yield` буде виконано в правильному порядку.
Наприклад, `dependency_c` може залежати від `dependency_b`, а `dependency_b` - від `dependency_a`:
@@ -194,7 +194,7 @@ participant tasks as Background tasks
`Depends()` приймає параметр `scope`, який може бути:
-* `"function"`: запустити залежність перед *функцією операції шляху*, що обробляє запит, завершити залежність після завершення *функції операції шляху*, але **до** того, як відповідь буде відправлена клієнту. Тобто функція залежності буде виконуватися **навколо** *функції операції **шляху***.
+* `"function"`: запустити залежність перед *функцією операції шляху*, що обробляє запит, завершити залежність після завершення *функції операції шляху*, але **до** того, як відповідь буде відправлена клієнту. Тобто функція залежності буде виконуватися **навколо** ***функції** операції шляху*.
* `"request"`: запустити залежність перед *функцією операції шляху*, що обробляє запит (подібно до `"function"`), але завершити **після** того, як відповідь буде відправлена клієнту. Тобто функція залежності буде виконуватися **навколо** циклу **запиту** та відповіді.
Якщо не вказано, і залежність має `yield`, за замовчуванням `scope` дорівнює `"request"`.
@@ -234,6 +234,7 @@ participant operation as Path Operation
Залежності з `yield` еволюціонували з часом, щоб покрити різні сценарії та виправити деякі проблеми.
Якщо ви хочете дізнатися, що змінювалося в різних версіях FastAPI, прочитайте про це в просунутому посібнику користувача: [Розширені залежності - Залежності з `yield`, `HTTPException`, `except` і фоновими задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
+
## Менеджери контексту { #context-managers }
### Що таке «Менеджери контексту» { #what-are-context-managers }
diff --git a/docs/uk/docs/tutorial/extra-data-types.md b/docs/uk/docs/tutorial/extra-data-types.md
index 26d7c306fe..15e6b64a49 100644
--- a/docs/uk/docs/tutorial/extra-data-types.md
+++ b/docs/uk/docs/tutorial/extra-data-types.md
@@ -22,7 +22,7 @@
Ось додаткові типи даних для використання:
* `UUID`:
- * Стандартний "Універсальний унікальний ідентифікатор", який часто використовується як ID у багатьох базах даних та системах.
+ * Стандартний «Універсальний унікальний ідентифікатор», який часто використовується як ID у багатьох базах даних та системах.
* У запитах та відповідях буде представлений як `str`.
* `datetime.datetime`:
* Пайтонівський `datetime.datetime`.
@@ -36,16 +36,16 @@
* `datetime.timedelta`:
* Пайтонівський `datetime.timedelta`.
* У запитах та відповідях буде представлений як `float` загальної кількості секунд.
- * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
+ * Pydantic також дозволяє представляти це як «ISO 8601 time diff encoding», [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* `frozenset`:
* У запитах і відповідях це буде оброблено так само, як і `set`:
* У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`.
* У відповідях `set` буде перетворено на `list`.
- * Згенерована схема буде вказувати, що значення `set` є унікальними (з використанням JSON Schema's `uniqueItems`).
+ * Згенерована схема буде вказувати, що значення `set` є унікальними (з використанням `uniqueItems` Схеми JSON).
* `bytes`:
* Стандартний Пайтонівський `bytes`.
* У запитах і відповідях це буде оброблено як `str`.
- * Згенерована схема буде вказувати, що це `str` з "форматом" `binary`.
+ * Згенерована схема буде вказувати, що це `str` з «форматом» `binary`.
* `Decimal`:
* Стандартний Пайтонівський `Decimal`.
* У запитах і відповідях це буде оброблено так само, як і `float`.
diff --git a/docs/uk/docs/tutorial/extra-models.md b/docs/uk/docs/tutorial/extra-models.md
index 271e553fd8..564f9fc441 100644
--- a/docs/uk/docs/tutorial/extra-models.md
+++ b/docs/uk/docs/tutorial/extra-models.md
@@ -63,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` вище, запис:
@@ -176,7 +176,7 @@ UserInDB(
У цьому прикладі ми передаємо `Union[PlaneItem, CarItem]` як значення аргументу `response_model`.
-Оскільки ми передаємо його як значення аргументу, а не в анотації типу, потрібно використовувати `Union` навіть у Python 3.10.
+Оскільки ми передаємо його як **значення аргументу**, а не розміщуємо в **анотації типу**, потрібно використовувати `Union` навіть у Python 3.10.
Якби це була анотація типу, можна було б використати вертикальну риску, наприклад:
@@ -184,7 +184,7 @@ UserInDB(
some_variable: PlaneItem | CarItem
```
-Але якщо записати це як присвоєння `response_model=PlaneItem | CarItem`, отримаємо помилку, тому що Python спробує виконати невалідну операцію між `PlaneItem` і `CarItem`, замість того щоб трактувати це як анотацію типу.
+Але якщо записати це як присвоєння `response_model=PlaneItem | CarItem`, отримаємо помилку, тому що Python спробує виконати **невалідну операцію** між `PlaneItem` і `CarItem`, замість того щоб трактувати це як анотацію типу.
## Список моделей { #list-of-models }
@@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem
Використовуйте кілька моделей Pydantic і вільно наслідуйте для кожного випадку.
-Не обов’язково мати одну модель даних на сутність, якщо ця сутність може мати різні «стани». Як у випадку сутності користувача зі станами: з `password`, з `password_hash` і без пароля.
+Не обов’язково мати одну модель даних на сутність, якщо ця сутність повинна мати різні «стани». «Сутність» **користувач** є прикладом зі станами, що включають `password`, `password_hash` або відсутність пароля.
diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md
index 2557d646ca..0469e6c4dd 100644
--- a/docs/uk/docs/tutorial/first-steps.md
+++ b/docs/uk/docs/tutorial/first-steps.md
@@ -88,13 +88,13 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
#### «Схема» { #schema }
-«Схема» — це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис.
+«Схема» - це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис.
#### API «схема» { #api-schema }
У цьому випадку, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) є специфікацією, яка визначає, як описати схему вашого API.
-Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо.
+Це визначення схеми включає шляхи вашого API, можливі параметри, які вони приймають, тощо.
#### «Схема» даних { #data-schema }
@@ -102,13 +102,13 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
У цьому випадку це означає атрибути JSON і типи даних, які вони мають, тощо.
-#### OpenAPI і JSON Schema { #openapi-and-json-schema }
+#### OpenAPI і Схема JSON { #openapi-and-json-schema }
-OpenAPI описує схему API для вашого API. І ця схема включає визначення (або «схеми») даних, що надсилаються та отримуються вашим API, за допомогою **JSON Schema**, стандарту для схем даних JSON.
+OpenAPI описує схему API для вашого API. І ця схема включає визначення (або «схеми») даних, що надсилаються та отримуються вашим API, за допомогою **Схеми JSON**, стандарту для схем даних JSON.
#### Перевірте `openapi.json` { #check-the-openapi-json }
-Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API.
+Якщо вас цікавить, як виглядає «сирa» схема OpenAPI, FastAPI автоматично генерує JSON (схему) з описами всього вашого API.
Ви можете побачити це напряму тут: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
@@ -137,7 +137,7 @@ OpenAPI описує схему API для вашого API. І ця схема
#### Для чого потрібний OpenAPI { #what-is-openapi-for }
-OpenAPI schema — це те, на чому працюють дві включені системи інтерактивної документації.
+Схема OpenAPI - це те, на чому працюють дві включені системи інтерактивної документації.
Також існують десятки альтернатив, і всі вони засновані на OpenAPI. Ви можете легко додати будь-яку з цих альтернатив до вашого застосунку, створеного з **FastAPI**.
@@ -226,11 +226,11 @@ CLI автоматично визначить ваш застосунок FastAP
{* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *}
-`FastAPI` — це клас у Python, який надає всю функціональність для вашого API.
+`FastAPI` - це клас у Python, який надає всю функціональність для вашого API.
/// note | Технічні деталі
-`FastAPI` — це клас, який успадковується безпосередньо від `Starlette`.
+`FastAPI` - це клас, який успадковується безпосередньо від `Starlette`.
Ви також можете використовувати всю функціональність [Starlette](https://www.starlette.dev/) у `FastAPI`.
@@ -312,7 +312,7 @@ https://example.com/items/foo
Декоратор `@app.get("/")` повідомляє **FastAPI**, що функція одразу нижче відповідає за обробку запитів, які надходять до:
* шляху `/`
-* використовуючи
get операція
+* використовуючи
операцію get
/// note | `@decorator` Інформація
@@ -389,7 +389,7 @@ https://example.com/items/foo
Також можна повернути моделі Pydantic (про це ви дізнаєтесь пізніше).
-Існує багато інших обʼєктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені — велика ймовірність, що вони вже підтримуються.
+Існує багато інших обʼєктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені - велика ймовірність, що вони вже підтримуються.
### Крок 6: розгорніть його { #step-6-deploy-it }
@@ -403,11 +403,11 @@ https://example.com/items/foo
Він переносить той самий **досвід розробника** зі створення застосунків на FastAPI на **розгортання** їх у хмарі. 🎉
-FastAPI Cloud — основний спонсор і джерело фінансування для open source проєктів *FastAPI and friends*. ✨
+FastAPI Cloud - основний спонсор і джерело фінансування для open source проєктів *FastAPI and friends*. ✨
#### Розгортання в інших хмарних провайдерах { #deploy-to-other-cloud-providers }
-FastAPI — це open source і базується на стандартах. Ви можете розгортати FastAPI-застосунки у будь-якого хмарного провайдера на ваш вибір.
+FastAPI - це open source і базується на стандартах. Ви можете розгортати FastAPI-застосунки у будь-якого хмарного провайдера на ваш вибір.
Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути FastAPI-застосунки з їхньою допомогою. 🤓
diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md
index 262efa0e03..381e65cc07 100644
--- a/docs/uk/docs/tutorial/handling-errors.md
+++ b/docs/uk/docs/tutorial/handling-errors.md
@@ -33,7 +33,7 @@
Оскільки це помилка Python, ви не `return` її, а `raise` її.
-Це також означає, що якщо ви перебуваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там згенеруєте `HTTPException` всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
+Це також означає, що якщо ви перебваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там згенеруєте `HTTPException` всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
Перевага генерації виключення замість повернення значення стане більш очевидною в розділі про залежності та безпеку.
diff --git a/docs/uk/docs/tutorial/index.md b/docs/uk/docs/tutorial/index.md
index 629b71decc..f89656236d 100644
--- a/docs/uk/docs/tutorial/index.md
+++ b/docs/uk/docs/tutorial/index.md
@@ -54,7 +54,7 @@ $
fastapi dev
**ДУЖЕ радимо** написати або скопіювати код, відредагувати його та запустити локально.
-Використання його у своєму редакторі – це те, що дійсно показує вам переваги FastAPI, бачите, як мало коду вам потрібно написати, всі перевірки типів, автозаповнення тощо.
+Використання його у своєму редакторі - це те, що дійсно показує вам переваги FastAPI, бачите, як мало коду вам потрібно написати, всі перевірки типів, автозаповнення тощо.
---
@@ -86,7 +86,7 @@ $ pip install "fastapi[standard]"
/// tip | Порада
-FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud — усе безпосередньо з вашого редактора.
+FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud - усе безпосередньо з вашого редактора.
///
diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md
index d34b83b383..fd7a13b726 100644
--- a/docs/uk/docs/tutorial/metadata.md
+++ b/docs/uk/docs/tutorial/metadata.md
@@ -11,7 +11,7 @@
| `title` | `str` | Назва API. |
| `summary` | `str` | Короткий підсумок API.
Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Короткий опис API. Може використовувати Markdown. |
-| `version` | `string` | Версія API. Це версія вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
+| `version` | `str` | Версія API. Це версія вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
| `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. |
| `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів.
contact поля
| Параметр | Тип | Опис |
|---|
name | str | Ідентифікаційне ім'я контактної особи або організації. |
url | str | URL, що вказує на контактну інформацію. МАЄ бути у форматі URL. |
email | str | Адреса електронної пошти контактної особи або організації. МАЄ бути у форматі адреси електронної пошти. |
|
| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів.
license_info поля
| Параметр | Тип | Опис |
|---|
name | str | ОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API. |
identifier | str | Ліцензійний вираз за [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | URL до ліцензії, яка використовується для API. МАЄ бути у форматі URL. |
|
diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md
index 47ae65f3e4..151e79d1e6 100644
--- a/docs/uk/docs/tutorial/path-operation-configuration.md
+++ b/docs/uk/docs/tutorial/path-operation-configuration.md
@@ -12,7 +12,7 @@
Ви можете визначити (HTTP) `status_code`, який буде використано у відповіді вашої «операції шляху».
-Можна передати безпосередньо цілий код, наприклад `404`.
+Ви можете передати безпосередньо код `int`, наприклад `404`.
Якщо ви не пам'ятаєте призначення числових кодів, скористайтеся скороченими константами в `status`:
@@ -24,7 +24,7 @@
Ви також можете використати `from starlette import status`.
-FastAPI надає той самий `starlette.status` як `fastapi.status` для вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
+**FastAPI** надає той самий `starlette.status` як `fastapi.status` для вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
///
@@ -40,11 +40,11 @@ FastAPI надає той самий `starlette.status` як `fastapi.status` д
### Мітки з переліками { #tags-with-enums }
-У великому застосунку ви можете накопичити багато міток і захочете переконатися, що завжди використовуєте ту саму мітку для пов'язаних «операцій шляху».
+У великому застосунку ви можете накопичити **багато міток** і захочете переконатися, що завжди використовуєте **ту саму мітку** для пов'язаних «операцій шляху».
У таких випадках має сенс зберігати мітки в `Enum`.
-FastAPI підтримує це так само, як і зі звичайними строками:
+**FastAPI** підтримує це так само, як і зі звичайними строками:
{* ../../docs_src/path_operation_configuration/tutorial002b_py310.py hl[1,8:10,13,18] *}
@@ -56,7 +56,7 @@ FastAPI підтримує це так само, як і зі звичайним
## Опис зі строки документації { #description-from-docstring }
-Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у
строці документації функції, і FastAPI прочитає його звідти.
+Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у
строці документації функції, і **FastAPI** прочитає його звідти.
Ви можете писати [Markdown](https://en.wikipedia.org/wiki/Markdown) у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації).
@@ -82,7 +82,7 @@ FastAPI підтримує це так само, як і зі звичайним
OpenAPI визначає, що кожна «операція шляху» потребує опису відповіді.
-Тому, якщо ви його не надасте, FastAPI автоматично згенерує «Successful response».
+Тому, якщо ви його не надасте, **FastAPI** автоматично згенерує «Successful response».
///
@@ -98,7 +98,7 @@ OpenAPI визначає, що кожна «операція шляху» пот

-Подивіться, як виглядають застарілі та незастарілі «операції шляху»:
+Перевірте, як виглядають застарілі та незастарілі «операції шляху»:

diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md
index bca5874c2a..610e83f412 100644
--- a/docs/uk/docs/tutorial/query-params-str-validations.md
+++ b/docs/uk/docs/tutorial/query-params-str-validations.md
@@ -1,4 +1,4 @@
-# Query параметри та валідація рядків { #query-parameters-and-string-validations }
+# Параметри запиту та валідація строк { #query-parameters-and-string-validations }
**FastAPI** дозволяє оголошувати додаткову інформацію та виконувати валідацію для ваших параметрів.
@@ -6,7 +6,7 @@
{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
-Query параметр `q` має тип `str | None`, що означає, що він має тип `str`, але також може бути `None`, і справді, значення за замовчуванням — `None`, тож FastAPI знатиме, що він не є обов'язковим.
+Параметр запиту `q` має тип `str | None`, що означає, що він має тип `str`, але також може бути `None`, і справді, значення за замовчуванням - `None`, тож FastAPI знатиме, що він не є обов'язковим.
/// note | Примітка
@@ -18,7 +18,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
## Додаткова валідація { #additional-validation }
-Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, його довжина не перевищувала 50 символів.
+Ми забезпечимо, що навіть якщо `q` є необов’язковим, коли його передають, **його довжина не перевищувала 50 символів**.
### Імпорт `Query` та `Annotated` { #import-query-and-annotated }
@@ -45,7 +45,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
Зараз саме час використати його разом із FastAPI. 🚀
-Раніше ми мали таку анотацію типу:
+Ми мали таку анотацію типу:
```Python
q: str | None = None
@@ -57,31 +57,31 @@ q: str | None = None
q: Annotated[str | None] = None
```
-Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
+Обидві ці версії означають одне й те саме: `q` - це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
А тепер переходимо до цікавого! 🎉
## Додавання `Query` до `Annotated` у параметр `q` { #add-query-to-annotated-in-the-q-parameter }
-Тепер, коли у нас є `Annotated`, де ми можемо додавати додаткову інформацію (у цьому випадку — додаткову валідацію), додамо `Query` всередину `Annotated` і встановимо параметр `max_length` у `50`:
+Тепер, коли у нас є `Annotated`, де ми можемо додавати додаткову інформацію (у цьому випадку - додаткову валідацію), додамо `Query` всередину `Annotated` і встановимо параметр `max_length` у `50`:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *}
Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим.
-Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо додаткову валідацію для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
+Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо **додаткову валідацію** для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
/// tip | Порада
-Тут ми використовуємо `Query()`, оскільки це query параметр. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
+Тут ми використовуємо `Query()`, оскільки це **параметр запиту**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
///
Тепер FastAPI:
-* Перевірить дані, щоб переконатися, що їхня максимальна довжина — 50 символів
-* Покажe чітку помилку клієнту, якщо дані недійсні
-* Задокументує параметр в OpenAPI-схемі операції шляху (що відобразиться в автоматично згенерованій документації)
+* **Перевірить** дані, щоб переконатися, що їхня максимальна довжина - 50 символів
+* Покажe **чітку помилку** клієнту, якщо дані недійсні
+* **Задокументує** параметр в *операції шляху* схеми OpenAPI (що відобразиться в **автоматичному інтерфейсі документації**)
## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value }
@@ -93,7 +93,7 @@ q: Annotated[str | None] = None
///
-Раніше ми писали `Query()` як значення за замовчуванням для параметра функції, встановлюючи `max_length` у 50:
+Раніше ми писали `Query()` як значення за замовчуванням для параметра функції, встановлюючи параметр `max_length` у 50:
{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *}
@@ -107,19 +107,20 @@ q: str | None = Query(default=None)
...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно:
+
```Python
q: str | None = None
```
-Але у версії з `Query` ми явно вказуємо, що це query параметр.
+Але у версії з `Query` ми явно вказуємо, що це параметр запиту.
-Далі ми можемо передавати `Query` додаткові параметри. У цьому випадку — параметр `max_length`, який застосовується до рядків:
+Далі ми можемо передавати `Query` додаткові параметри. У цьому випадку - параметр `max_length`, який застосовується до строк:
```Python
q: str | None = Query(default=None, max_length=50)
```
-Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI операції шляху.
+Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у *операції шляху* схеми OpenAPI.
### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -149,13 +150,13 @@ q: str = Query(default="rick")
### Переваги використання `Annotated` { #advantages-of-annotated }
-Використання `Annotated` є рекомендованим замість задання значення за замовчуванням у параметрах функції, оскільки воно краще з кількох причин. 🤓
+**Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓
-Значення за замовчуванням параметра функції є фактичним значенням за замовчуванням, що є більш інтуїтивним у Python загалом. 😌
+**Значення за замовчуванням** **параметра функції** є **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌
-Ви можете викликати ту саму функцію в інших місцях без FastAPI, і вона працюватиме очікувано. Якщо параметр є обов’язковим (без значення за замовчуванням), ваш редактор повідомить про помилку, а Python також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра.
+Ви можете **викликати** ту саму функцію в **інших місцях** без FastAPI, і вона **працюватиме очікувано**. Якщо параметр є **обов’язковим** (без значення за замовчуванням), ваш **редактор** повідомить про помилку, а **Python** також видасть помилку, якщо ви виконаєте функцію без передавання обов’язкового параметра.
-Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
+Якщо ви не використовуєте `Annotated`, а використовуєте **(старий) стиль значень за замовчуванням**, то при виклику цієї функції без FastAPI в **інших місцях** потрібно **пам’ятати** передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції - лише коли операції всередині завершаться помилкою.
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як [Typer](https://typer.tiangolo.com/). 🚀
@@ -167,7 +168,7 @@ q: str = Query(default="rick")
## Додавання регулярних виразів { #add-regular-expressions }
-Ви можете визначити
регулярний вираз `pattern`, якому має відповідати параметр:
+Ви можете визначити
регулярний вираз `pattern`, якому має відповідати параметр:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@@ -177,7 +178,7 @@ q: str = Query(default="rick")
* `fixedquery`: точно відповідає значенню `fixedquery`.
* `$`: закінчується тут, після `fixedquery` немає жодних символів.
-Якщо ви почуваєтеся розгублено щодо **«regular expression»**, не хвилюйтеся. Це складна тема для багатьох людей. Ви все одно можете робити багато речей без використання регулярних виразів.
+Якщо ви почуваєтеся розгублено щодо всіх цих ідей **«регулярного виразу»**, не хвилюйтеся. Це складна тема для багатьох людей. Ви все одно можете робити багато речей без потреби в регулярних виразах.
Тепер ви знаєте, що коли вони знадобляться, їх можна застосовувати у **FastAPI**.
@@ -185,19 +186,19 @@ q: str = Query(default="rick")
Ви можете, звісно, використовувати значення за замовчуванням, відмінні від `None`.
-Припустімо, що ви хочете оголосити query параметр `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
+Припустімо, що ви хочете оголосити параметр запиту `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
{* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *}
/// note | Примітка
-Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (not required).
+Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (не обов’язковим).
///
## Обов’язкові параметри { #required-parameters }
-Якщо нам не потрібно оголошувати додаткові валідації або метадані, ми можемо зробити query параметр `q` обов’язковим, просто не вказуючи значення за замовчуванням, наприклад:
+Якщо нам не потрібно оголошувати додаткові валідації або метадані, ми можемо зробити параметр запиту `q` обов’язковим, просто не вказуючи значення за замовчуванням, наприклад:
```Python
q: str
@@ -227,11 +228,11 @@ q: Annotated[str | None, Query(min_length=3)] = None
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
-## Список query параметрів / кілька значень { #query-parameter-list-multiple-values }
+## Список параметрів запиту / кілька значень { #query-parameter-list-multiple-values }
-Коли ви явно визначаєте query параметр за допомогою `Query`, ви також можете оголосити, що він має приймати список значень, або, іншими словами, кілька значень.
+Коли ви явно визначаєте параметр запиту за допомогою `Query`, ви також можете оголосити, що він має приймати список значень, або, іншими словами, кілька значень.
-Наприклад, щоб оголосити query параметр `q`, який може з’являтися в URL кілька разів, можна написати:
+Наприклад, щоб оголосити параметр запиту `q`, який може з’являтися в URL кілька разів, можна написати:
{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
@@ -241,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
http://localhost:8000/items/?q=foo&q=bar
```
-ви отримаєте кілька значень `q` query параметрів (`foo` і `bar`) у вигляді Python `list` у вашій функції операції шляху, у параметрі функції `q`.
+ви отримаєте кілька значень *параметрів запиту* `q` (`foo` і `bar`) у вигляді Python `list` у вашій *функції операції шляху*, у *параметрі функції* `q`.
Отже, відповідь на цей URL буде:
@@ -256,7 +257,7 @@ http://localhost:8000/items/?q=foo&q=bar
/// tip | Порада
-Щоб оголосити query параметр з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
+Щоб оголосити параметр запиту з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
///
@@ -264,7 +265,7 @@ http://localhost:8000/items/?q=foo&q=bar

-### Список query параметрів / кілька значень за замовчуванням { #query-parameter-list-multiple-values-with-defaults }
+### Список параметрів запиту / кілька значень за замовчуванням { #query-parameter-list-multiple-values-with-defaults }
Ви також можете визначити значення за замовчуванням `list`, якщо жодне значення не було передане:
@@ -297,7 +298,7 @@ http://localhost:8000/items/
Майте на увазі, що в цьому випадку FastAPI не перевірятиме вміст списку.
-Наприклад, `list[int]` перевірятиме (і документуватиме), що вміст списку — цілі числа. Але `list` без уточнення цього не робитиме.
+Наприклад, `list[int]` перевірятиме (і документуватиме), що вміст списку - цілі числа. Але `list` без уточнення цього не робитиме.
///
@@ -305,7 +306,7 @@ http://localhost:8000/items/
Ви можете додати більше інформації про параметр.
-Ця інформація буде включена у згенерований OpenAPI та використана інтерфейсами документації та зовнішніми інструментами.
+Ця інформація буде включена у згенерований OpenAPI та використана користувацькими інтерфейсами документації та зовнішніми інструментами.
/// note | Примітка
@@ -333,9 +334,9 @@ http://localhost:8000/items/
http://127.0.0.1:8000/items/?item-query=foobaritems
```
-Але `item-query` — це некоректна назва змінної в Python.
+Але `item-query` - це некоректна назва змінної в Python.
-Найближчий допустимий варіант — `item_query`.
+Найближчий допустимий варіант - `item_query`.
Проте вам потрібно, щоб параметр залишався саме `item-query`...
@@ -359,17 +360,17 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
## Виняток параметрів з OpenAPI { #exclude-parameters-from-openapi }
-Щоб виключити query параметр зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
+Щоб виключити параметр запиту зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
## Кастомна валідація { #custom-validation }
-Можуть бути випадки, коли вам потрібно провести кастомну валідацію, яку не можна реалізувати за допомогою параметрів, показаних вище.
+Можуть бути випадки, коли вам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище.
-У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
+У таких випадках ви можете використати **кастомну функцію-валідатор**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
-Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) в середині `Annotated`.
+Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) всередині `Annotated`.
/// tip | Порада
@@ -377,7 +378,7 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
///
-Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги
ISBN або з `imdb-` для ID URL фільму на
IMDB:
+Наприклад, цей кастомний валідатор перевіряє, чи починається ID предмета з `isbn-` для номера книги
ISBN або з `imdb-` для ID URL фільму на
IMDB:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
@@ -389,39 +390,39 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
/// tip | Порада
-Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким зовнішнім компонентом, таким як база даних чи інший API, замість цього слід використовувати FastAPI Dependencies — ви дізнаєтесь про них пізніше.
+Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким **зовнішнім компонентом**, таким як база даних чи інший API, замість цього слід використовувати **FastAPI Dependencies** - ви дізнаєтесь про них пізніше.
-Ці кастомні валідатори використовуються для речей, які можна перевірити лише з тими самими даними, що надані в запиті.
+Ці кастомні валідатори використовуються для речей, які можна перевірити **лише** з **тими самими даними**, що надані в запиті.
///
### Зрозумійте цей код { #understand-that-code }
-Головний момент — це використання `AfterValidator` з функцією всередині `Annotated`. Можете пропустити цю частину, якщо хочете. 🤸
+Головний момент - це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸
---
Але якщо вам цікаво розібратися в цьому конкретному прикладі коду і вам ще не набридло, ось кілька додаткових деталей.
-#### Рядок із `value.startswith()` { #string-with-value-startswith }
+#### Строка з `value.startswith()` { #string-with-value-startswith }
-Звернули увагу? Рядок із `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі:
+Звернули увагу? Строка з `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
-#### Випадковий елемент { #a-random-item }
+#### Випадковий предмет { #a-random-item }
-За допомогою `data.items()` ми отримуємо
ітерабельний об'єкт із кортежами, що містять ключ і значення для кожного елемента словника.
+За допомогою `data.items()` ми отримуємо
ітерабельний об'єкт із кортежами, що містять ключ і значення для кожного предмета словника.
Ми перетворюємо цей ітерабельний об'єкт у звичайний `list` за допомогою `list(data.items())`.
-Потім, використовуючи `random.choice()`, ми можемо отримати випадкове значення зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+Потім, використовуючи `random.choice()`, ми можемо отримати **випадкове значення** зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
-Далі ми присвоюємо ці два значення кортежу змінним `id` і `name`.
+Далі ми **присвоюємо ці два значення** кортежу змінним `id` і `name`.
-Тож, якщо користувач не вказав ID елемента, він все одно отримає випадкову рекомендацію.
+Тож, якщо користувач не вказав ID предмета, він все одно отримає випадкову рекомендацію.
-...ми робимо все це в одному простому рядку. 🤯 Хіба ви не любите Python? 🐍
+...ми робимо все це в **одному простому рядку**. 🤯 Хіба ви не любите Python? 🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
@@ -436,7 +437,7 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
* `description`
* `deprecated`
-Валідації, специфічні для рядків:
+Валідації, специфічні для строк:
* `min_length`
* `max_length`
diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md
index 755b9e21ab..d70fb1fe37 100644
--- a/docs/uk/docs/tutorial/query-params.md
+++ b/docs/uk/docs/tutorial/query-params.md
@@ -1,10 +1,10 @@
-# Query параметри { #query-parameters }
+# Параметри запиту { #query-parameters }
-Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «query».
+Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «запиту».
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
-Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
+Запит - це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
Наприклад, в URL:
@@ -12,25 +12,25 @@ Query — це набір пар ключ-значення, що йдуть пі
http://127.0.0.1:8000/items/?skip=0&limit=10
```
-...параметрами query є:
+...параметрами запиту є:
* `skip`: зі значенням `0`
* `limit`: зі значенням `10`
-Оскільки вони є частиною URL, вони «природно» є рядками.
+Оскільки вони є частиною URL, вони «природно» є строками.
Але коли ви оголошуєте їх із типами Python (у наведеному прикладі як `int`), вони перетворюються на цей тип і проходять перевірку відповідності.
-Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів query:
+Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів запиту:
* Підтримка в редакторі (очевидно)
-*
«парсинг» даних
+*
«парсинг» даних
* Валідація даних
* Автоматична документація
## Значення за замовчуванням { #defaults }
-Оскільки параметри query не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
+Оскільки параметри запиту не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
У наведеному вище прикладі вони мають значення за замовчуванням: `skip=0` і `limit=10`.
@@ -59,7 +59,7 @@ http://127.0.0.1:8000/items/?skip=20
## Необов'язкові параметри { #optional-parameters }
-Так само ви можете оголосити необов’язкові параметри query, встановивши для них значення за замовчуванням `None`:
+Так само ви можете оголосити необов’язкові параметри запиту, встановивши для них значення за замовчуванням `None`:
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
@@ -67,11 +67,11 @@ http://127.0.0.1:8000/items/?skip=20
/// tip | Порада
-Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
+Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` - ні, отже, це параметр запиту.
///
-## Перетворення типу параметра query { #query-parameter-type-conversion }
+## Перетворення типу параметра запиту { #query-parameter-type-conversion }
Ви також можете оголошувати параметри типу `bool`, і вони будуть автоматично конвертовані:
@@ -107,12 +107,12 @@ 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`. В іншому випадку - `False`.
-## Кілька path і query параметрів { #multiple-path-and-query-parameters }
+## Кілька параметрів шляху та запиту { #multiple-path-and-query-parameters }
-Ви можете одночасно оголошувати кілька параметрів шляху та параметрів query, **FastAPI** знає, який з них який.
+Ви можете одночасно оголошувати кілька параметрів шляху та параметрів запиту, **FastAPI** знає, який з них який.
І вам не потрібно оголошувати їх у якомусь конкретному порядку.
@@ -120,17 +120,17 @@ http://127.0.0.1:8000/items/foo?short=yes
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
-## Обов’язкові параметри query { #required-query-parameters }
+## Обов’язкові параметри запиту { #required-query-parameters }
-Коли ви оголошуєте значення за замовчуванням для не-path-параметрів (поки що ми бачили лише параметри query), тоді вони не є обов’язковими.
+Коли ви оголошуєте значення за замовчуванням для параметрів, що не є параметрами шляху (поки що ми бачили лише параметри запиту), тоді вони не є обов’язковими.
Якщо ви не хочете задавати конкретне значення, а просто зробити параметр необов’язковим, задайте `None` як значення за замовчуванням.
-Але якщо ви хочете зробити параметр query обов’язковим, просто не вказуйте для нього значення за замовчуванням:
+Але якщо ви хочете зробити параметр запиту обов’язковим, просто не вказуйте для нього значення за замовчуванням:
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
-Тут параметр query `needy` — обов’язковий параметр query типу `str`.
+Тут параметр запиту `needy` - обов’язковий параметр запиту типу `str`.
Якщо ви відкриєте у браузері URL-адресу:
@@ -171,11 +171,11 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
}
```
-І звісно, ви можете визначити деякі параметри як обов’язкові, деякі — зі значенням за замовчуванням, а деякі — повністю необов’язкові:
+І звісно, ви можете визначити деякі параметри як обов’язкові, деякі - зі значенням за замовчуванням, а деякі - повністю необов’язкові:
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
-У цьому випадку є 3 параметри query:
+У цьому випадку є 3 параметри запиту:
* `needy`, обов’язковий `str`.
* `skip`, `int` зі значенням за замовчуванням `0`.
diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md
index b7179c393a..0785dd2067 100644
--- a/docs/uk/docs/tutorial/request-files.md
+++ b/docs/uk/docs/tutorial/request-files.md
@@ -12,7 +12,7 @@
$ pip install python-multipart
```
-Це необхідно, оскільки завантажені файли передаються у вигляді «form data».
+Це необхідно, оскільки завантажені файли передаються як «дані форми».
///
@@ -30,7 +30,7 @@ $ pip install python-multipart
/// note | Примітка
-`File` — це клас, який безпосередньо успадковує `Form`.
+`File` - це клас, який безпосередньо успадковує `Form`.
Але пам’ятайте, що коли ви імпортуєте `Query`, `Path`, `File` та інші з `fastapi`, це насправді функції, які повертають спеціальні класи.
@@ -42,7 +42,7 @@ $ pip install python-multipart
///
-Файли будуть завантажені у вигляді «form data».
+Файли будуть завантажені як «дані форми».
Якщо ви оголосите тип параметра *функції операції шляху* як `bytes`, **FastAPI** прочитає файл за вас, і ви отримаєте його вміст у вигляді `bytes`.
@@ -70,8 +70,8 @@ $ pip install python-multipart
`UploadFile` має такі атрибути:
-* `filename`: Рядок `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`).
-* `content_type`: Рядок `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`).
+* `filename`: Строка `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`).
+* `content_type`: Строка `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`).
* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт.
`UploadFile` має такі асинхронні `async` методи. Вони всі викликають відповідні методи файлу під капотом (використовуючи внутрішній `SpooledTemporaryFile`).
@@ -109,7 +109,7 @@ contents = myfile.file.read()
///
-## Що таке «Form Data» { #what-is-form-data }
+## Що таке «дані форми» { #what-is-form-data }
Спосіб, у який HTML-форми (`
`) надсилають дані на сервер, зазвичай використовує «спеціальне» кодування для цих даних, відмінне від JSON.
@@ -121,7 +121,7 @@ contents = myfile.file.read()
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла.
-Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з [
MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Якщо ви хочете дізнатися більше про ці типи кодування та поля форми, ознайомтеся з [
MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
@@ -149,7 +149,7 @@ contents = myfile.file.read()
Можна завантажувати кілька файлів одночасно.
-Вони будуть пов’язані з одним і тим самим «form field», який передається у вигляді «form data».
+Вони будуть пов’язані з одним і тим самим «полем форми», яке передається як «дані форми».
Щоб це реалізувати, потрібно оголосити список `bytes` або `UploadFile`:
@@ -173,4 +173,4 @@ contents = myfile.file.read()
## Підсумок { #recap }
-Використовуйте `File`, `bytes` та `UploadFile`, щоб оголошувати файли для завантаження в запиті, надіслані у вигляді form data.
+Використовуйте `File`, `bytes` та `UploadFile`, щоб оголошувати файли для завантаження в запиті, надіслані як дані форми.
diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md
index 382826a409..3113779087 100644
--- a/docs/uk/docs/tutorial/request-forms.md
+++ b/docs/uk/docs/tutorial/request-forms.md
@@ -34,7 +34,7 @@ $ pip install python-multipart
/// note | Примітка
-`Form` — це клас, який безпосередньо наслідується від `Body`.
+`Form` - це клас, який безпосередньо наслідується від `Body`.
///
diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md
index 3915a53ed0..4e49cdc606 100644
--- a/docs/uk/docs/tutorial/response-status-code.md
+++ b/docs/uk/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Код статусу відповіді { #response-status-code }
+
Так само, як ви можете вказати модель відповіді, ви також можете оголосити HTTP код статусу, що використовується для відповіді, за допомогою параметра `status_code` в будь-якій з *операцій шляху*:
* `@app.get()`
diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md
index b63a2d253d..734a06d1a1 100644
--- a/docs/uk/docs/tutorial/schema-extra-example.md
+++ b/docs/uk/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Декларування прикладів вхідних даних { #declare-request-example-data }
+# Декларування прикладів даних запиту { #declare-request-example-data }
Ви можете задати приклади даних, які ваш застосунок може отримувати.
@@ -42,7 +42,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
## `examples` у Схемі JSON - OpenAPI { #examples-in-json-schema-openapi }
-При використанні будь-кого з наступного:
+Під час використання будь-чого з наведеного:
* `Path()`
* `Query()`
@@ -109,7 +109,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
* `value`: це сам приклад, який буде показано, наприклад `dict`.
* `externalValue`: альтернатива `value`, URL-адреса, що вказує на приклад. Проте це може не підтримуватися такою кількістю інструментів, як `value`.
-Використання виглядає так:
+Ви можете використати це так:
{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md
index aa0d21e2eb..7feee1c02b 100644
--- a/docs/uk/docs/tutorial/security/first-steps.md
+++ b/docs/uk/docs/tutorial/security/first-steps.md
@@ -4,7 +4,7 @@
А **frontend** - на іншому домені або в іншому шляху того ж домену (або у мобільному застосунку).
-І ви хочете, щоб frontend міг автентифікуватися в backend, використовуючи ім'я користувача та пароль.
+І ви хочете, щоб frontend міг автентифікуватися в backend, використовуючи **ім'я користувача** та **пароль**.
Ми можемо використати **OAuth2**, щоб збудувати це з **FastAPI**.
@@ -40,7 +40,7 @@ $ pip install python-multipart
///
-Запустіть приклад:
+Запустіть приклад за допомогою:
@@ -60,7 +60,7 @@ $ fastapi dev

-/// tip | Кнопка Authorize!
+/// tip | Кнопка «Authorize»!
У вас уже є нова блискуча кнопка «Authorize».
@@ -78,7 +78,7 @@ $ fastapi dev
///
-Звісно, це не frontend для кінцевих користувачів, але це чудовий інструмент для інтерактивної документації всього вашого API.
+Звісно, це не frontend для кінцевих користувачів, але це чудовий автоматичний інструмент для інтерактивного документування всього вашого API.
Ним може користуватися команда frontend (якою можете бути і ви самі).
@@ -86,11 +86,11 @@ $ fastapi dev
І ним також можете користуватися ви самі, щоб налагоджувати, перевіряти та тестувати той самий застосунок.
-## Потік паролю { #the-password-flow }
+## Потік `password` { #the-password-flow }
Тепер повернімося трохи назад і розберімося, що це все таке.
-`password` «flow» - це один зі способів («flows»), визначених в OAuth2, для обробки безпеки та автентифікації.
+`password` «потік» - це один зі способів («потоків»), визначених в OAuth2, для обробки безпеки та автентифікації.
OAuth2 був спроєктований так, щоб backend або API могли бути незалежними від сервера, який автентифікує користувача.
@@ -100,7 +100,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
- Користувач вводить `username` і `password` у frontend і натискає `Enter`.
- Frontend (у браузері користувача) надсилає ці `username` і `password` на специфічну URL-адресу нашого API (оголошену як `tokenUrl="token"`).
-- API перевіряє ці `username` і `password` та повертає «токен» (ми ще нічого з цього не реалізували).
+- API перевіряє ці `username` і `password` та відповідає «токеном» (ми ще нічого з цього не реалізували).
- «Токен» - це просто строка з деяким вмістом, який ми можемо пізніше використати, щоб перевірити цього користувача.
- Зазвичай токен налаштований на завершення строку дії через певний час.
- Тож користувачу доведеться знову увійти пізніше.
@@ -116,11 +116,11 @@ OAuth2 був спроєктований так, щоб backend або API мо
**FastAPI** надає кілька інструментів на різних рівнях абстракції, щоб реалізувати ці функції безпеки.
-У цьому прикладі ми використаємо **OAuth2** з потоком **Password**, використовуючи токен **Bearer**. Це робиться за допомогою класу `OAuth2PasswordBearer`.
+У цьому прикладі ми використаємо **OAuth2** з потоком **Password**, використовуючи **токен носія**. Це робиться за допомогою класу `OAuth2PasswordBearer`.
/// note | Примітка
-«Bearer»-токен - не єдиний варіант.
+«Токен носія» - не єдиний варіант.
Але це найкращий для нашого сценарію.
@@ -138,7 +138,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
Тут `tokenUrl="token"` відноситься до відносної URL-адреси `token`, яку ми ще не створили. Оскільки це відносна URL-адреса, вона еквівалентна `./token`.
-Тому, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`.
+Оскільки ми використовуємо відносну URL-адресу, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо ваш API розміщений на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`.
Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [За представником](../../advanced/behind-a-proxy.md).
@@ -188,7 +188,7 @@ oauth2_scheme(some, parameters)
Вона шукатиме в запиті заголовок `Authorization`, перевірить, чи його значення - це `Bearer ` плюс деякий токен, і поверне токен як `str`.
-Якщо заголовка `Authorization` немає або значення не містить токена `Bearer `, вона одразу відповість помилкою зі статус-кодом 401 (`UNAUTHORIZED`).
+Якщо заголовка `Authorization` немає або значення не містить токена `Bearer `, вона одразу відповість помилкою з кодом статусу 401 (`UNAUTHORIZED`).
Вам навіть не потрібно перевіряти, чи існує токен, щоб повернути помилку. Ви можете бути певні: якщо ваша функція виконується, у параметрі токена буде `str`.
diff --git a/docs/uk/docs/tutorial/security/get-current-user.md b/docs/uk/docs/tutorial/security/get-current-user.md
index b3643a4395..1cd3085340 100644
--- a/docs/uk/docs/tutorial/security/get-current-user.md
+++ b/docs/uk/docs/tutorial/security/get-current-user.md
@@ -1,6 +1,6 @@
# Отримати поточного користувача { #get-current-user }
-У попередньому розділі система безпеки (яка базується на системі впровадження залежностей) передавала функції операції шляху `token` як `str`:
+У попередньому розділі система безпеки (яка базується на системі впровадження залежностей) передавала *функції операції шляху* `token` як `str`:
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
@@ -14,7 +14,7 @@
Так само, як ми використовуємо Pydantic для оголошення тіл, ми можемо використовувати його будь-де:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Створити залежність `get_current_user` { #create-a-get-current-user-dependency }
@@ -24,19 +24,19 @@
`get_current_user` матиме залежність із тим самим `oauth2_scheme`, який ми створили раніше.
-Так само, як ми робили раніше безпосередньо в операції шляху, наша нова залежність `get_current_user` отримає `token` як `str` від підзалежності `oauth2_scheme`:
+Так само, як ми робили раніше безпосередньо в *операції шляху*, наша нова залежність `get_current_user` отримає `token` як `str` від підзалежності `oauth2_scheme`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *}
## Отримати користувача { #get-the-user }
-`get_current_user` використає (фальшиву) утилітну функцію, яку ми створили, що приймає `token` як `str` і повертає нашу Pydantic-модель `User`:
+`get_current_user` використає (фальшиву) утилітну функцію, яку ми створили, що приймає токен як `str` і повертає нашу Pydantic-модель `User`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
## Впровадити поточного користувача { #inject-the-current-user }
-Тепер ми можемо використати той самий `Depends` з нашим `get_current_user` в операції шляху:
+Тепер ми можемо використати той самий `Depends` з нашим `get_current_user` в *операції шляху*:
{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *}
@@ -62,13 +62,13 @@
## Інші моделі { #other-models }
-Тепер ви можете отримувати поточного користувача безпосередньо у функціях операцій шляху та працювати з механізмами безпеки на рівні **впровадження залежностей**, використовуючи `Depends`.
+Тепер ви можете отримувати поточного користувача безпосередньо у *функціях операцій шляху* та працювати з механізмами безпеки на рівні **впровадження залежностей**, використовуючи `Depends`.
І ви можете використовувати будь-яку модель або дані для вимог безпеки (у цьому випадку Pydantic-модель `User`).
-Але ви не обмежені використанням якоїсь конкретної модели даних, класу чи типу.
+Але ви не обмежені використанням якоїсь конкретної моделі даних, класу чи типу.
-Хочете мати id та email і не мати жодного username у вашій моделі? Без проблем. Ви можете використовувати ті самі інструменти.
+Хочете мати `id` та `email` і не мати жодного `username` у вашій моделі? Без проблем. Ви можете використовувати ті самі інструменти.
Хочете мати просто `str`? Або лише `dict`? Або безпосередньо екземпляр класу моделі бази даних? Усе працює так само.
@@ -78,7 +78,7 @@
## Розмір коду { #code-size }
-Цей приклад може здаватися багатослівним. Майте на увазі, що ми змішуємо безпеку, моделі даних, утилітні функції та операції шляху в одному файлі.
+Цей приклад може здаватися багатослівним. Майте на увазі, що ми змішуємо безпеку, моделі даних, утилітні функції та *операції шляху* в одному файлі.
Але ось ключовий момент.
@@ -86,20 +86,20 @@
І ви можете зробити це настільки складним, наскільки потрібно. І все одно мати це написаним лише один раз, в одному місці. З усією гнучкістю.
-Зате ви можете мати тисячі кінцевих точок (операцій шляху), що використовують одну й ту саму систему безпеки.
+Зате ви можете мати тисячі кінцевих точок (*операцій шляху*), що використовують одну й ту саму систему безпеки.
І всі вони (або будь-яка їхня частина, яку ви захочете) можуть скористатися повторним використанням цих залежностей або будь-яких інших, які ви створите.
-І всі ці тисячі операцій шляху можуть бути всього у 3 рядки:
+І всі ці тисячі *операцій шляху* можуть бути всього у 3 рядки:
{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *}
## Підсумок { #recap }
-Тепер ви можете отримувати поточного користувача безпосередньо у вашій функції операції шляху.
+Тепер ви можете отримувати поточного користувача безпосередньо у вашій *функції операції шляху*.
Ми вже на півдорозі.
-Потрібно лише додати операцію шляху, щоб користувач/клієнт міг фактично надіслати `username` і `password`.
+Потрібно лише додати *операцію шляху*, щоб користувач/клієнт міг фактично надіслати `username` і `password`.
Далі саме це.
diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md
index 1213afe7b4..1fb53ff418 100644
--- a/docs/uk/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md
@@ -10,7 +10,7 @@
JWT означає «JSON Web Tokens».
-Це стандарт кодування об'єкта JSON у довгий щільний рядок без пробілів. Він виглядає так:
+Це стандарт кодування об'єкта JSON у довгу щільну строку без пробілів. Він виглядає так:
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
@@ -168,7 +168,7 @@ $ openssl rand -hex 32
{* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *}
-## Оновіть операцію шляху `/token` { #update-the-token-path-operation }
+## Оновіть *операцію шляху* `/token` { #update-the-token-path-operation }
Створіть `timedelta` з часом життя токена.
diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md
index 686839982c..7500792cce 100644
--- a/docs/uk/docs/tutorial/security/simple-oauth2.md
+++ b/docs/uk/docs/tutorial/security/simple-oauth2.md
@@ -28,9 +28,9 @@ OAuth2 визначає, що під час використання «пото
Їх зазвичай використовують для оголошення конкретних прав доступу, наприклад:
-- `users:read` або `users:write` — поширені приклади.
-- `instagram_basic` використовується Facebook / Instagram.
-- `https://www.googleapis.com/auth/drive` використовується Google.
+* `users:read` або `users:write` — поширені приклади.
+* `instagram_basic` використовується Facebook / Instagram.
+* `https://www.googleapis.com/auth/drive` використовується Google.
/// note | Примітка
@@ -56,21 +56,21 @@ OAuth2 визначає, що під час використання «пото
`OAuth2PasswordRequestForm` — це клас залежності, що оголошує тіло форми з:
-- `username`.
-- `password`.
-- Необов'язковим полем `scope` як великою строкою, складеною зі строк, розділених пробілами.
-- Необов'язковим `grant_type`.
+* `username`.
+* `password`.
+* Необов'язковим полем `scope` як великою строкою, складеною зі строк, розділених пробілами.
+* Необов'язковим `grant_type`.
/// tip | Порада
-Специфікація OAuth2 насправді вимагає поле `grant_type` із фіксованим значенням `password`, але `OAuth2PasswordRequestForm` цього не примушує.
+Специфікація OAuth2 насправді *вимагає* поле `grant_type` із фіксованим значенням `password`, але `OAuth2PasswordRequestForm` цього не примушує.
Якщо вам потрібно це примусити, використовуйте `OAuth2PasswordRequestFormStrict` замість `OAuth2PasswordRequestForm`.
///
-- Необов'язковим `client_id` (для нашого прикладу не потрібно).
-- Необов'язковим `client_secret` (для нашого прикладу не потрібно).
+* Необов'язковим `client_id` (для нашого прикладу не потрібно).
+* Необов'язковим `client_secret` (для нашого прикладу не потрібно).
/// note | Примітка
@@ -132,7 +132,7 @@ OAuth2 визначає, що під час використання «пото
`UserInDB(**user_dict)` означає:
-Передати ключі та значення з `user_dict` безпосередньо як аргументи ключ-значення, еквівалентно до:
+*Передати ключі та значення з `user_dict` безпосередньо як аргументи ключ-значення, еквівалентно до:*
```Python
UserInDB(
@@ -146,7 +146,7 @@ UserInDB(
/// note | Примітка
-Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict).
+Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-model-dump).
///
@@ -186,7 +186,7 @@ UserInDB(
Тепер оновимо наші залежності.
-Ми хочемо отримати `current_user` лише якщо цей користувач активний.
+Ми хочемо отримати `current_user` *лише* якщо цей користувач активний.
Тому створимо додаткову залежність `get_current_active_user`, яка своєю чергою використовує як залежність `get_current_user`.
@@ -200,7 +200,7 @@ UserInDB(
Додатковий заголовок `WWW-Authenticate` зі значенням `Bearer`, який ми тут повертаємо, також є частиною специфікації.
-Будь-який HTTP (помилка) зі статус-кодом 401 «UNAUTHORIZED» також має повертати заголовок `WWW-Authenticate`.
+Будь-який HTTP (помилка) з кодом статусу 401 «UNAUTHORIZED» також має повертати заголовок `WWW-Authenticate`.
У випадку токенів носія (наш випадок) значенням цього заголовка має бути `Bearer`.
diff --git a/docs/uk/docs/tutorial/sql-databases.md b/docs/uk/docs/tutorial/sql-databases.md
index 57b67226a0..ff294052ca 100644
--- a/docs/uk/docs/tutorial/sql-databases.md
+++ b/docs/uk/docs/tutorial/sql-databases.md
@@ -1,6 +1,6 @@
# SQL (реляційні) бази даних { #sql-relational-databases }
-**FastAPI** не вимагає від вас використовувати SQL (реляційну) базу даних. Але ви можете скористатися будь-якою базою даних, яку забажаєте.
+**FastAPI** не вимагає від вас використовувати SQL (реляційну) базу даних. Але ви можете скористатися **будь-якою базою даних**, яку забажаєте.
Тут ми розглянемо приклад з [SQLModel](https://sqlmodel.tiangolo.com/).
@@ -8,7 +8,7 @@
/// tip | Порада
-Ви можете використовувати будь-яку іншу бібліотеку для SQL або NoSQL баз (інколи їх називають
"ORMs"), FastAPI нічого не нав’язує. 😎
+Ви можете використовувати будь-яку іншу бібліотеку для SQL або NoSQL баз (інколи їх називають
«ORMs»), FastAPI нічого не нав’язує. 😎
///
@@ -65,7 +65,7 @@ $ pip install sqlmodel
* `Field(primary_key=True)` каже SQLModel, що `id` - це **первинний ключ** у SQL базі даних (більше про первинні ключі в SQL див. у документації SQLModel).
- Примітка: Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. [документацію SQLModel про первинні ключі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id).
+ **Примітка:** Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. [документацію SQLModel про первинні ключі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id).
* `Field(index=True)` каже SQLModel створити **SQL-індекс** для цього стовпця, що дозволить швидше виконувати пошук у базі даних під час читання даних, відфільтрованих за цим стовпцем.
diff --git a/docs/uk/docs/tutorial/static-files.md b/docs/uk/docs/tutorial/static-files.md
index 2141744c33..26c3c592ac 100644
--- a/docs/uk/docs/tutorial/static-files.md
+++ b/docs/uk/docs/tutorial/static-files.md
@@ -2,10 +2,18 @@
Ви можете автоматично надавати статичні файли з каталогу, використовуючи `StaticFiles`.
+/// tip | Порада
+
+Якщо вам потрібно розмістити фронтенд, натомість використовуйте `app.frontend()`, прочитайте про це у [Frontend](frontend.md).
+
+`app.frontend()` використовує `StaticFiles` всередині, з кількома додатковими перевагами для фронтендів, як-от обробка клієнтської маршрутизації.
+
+///
+
## Використання `StaticFiles` { #use-staticfiles }
* Імпортуйте `StaticFiles`.
-* «Під'єднати» екземпляр `StaticFiles()` з вказанням необхідного шляху.
+* «Змонтуйте» екземпляр `StaticFiles()` у певному шляху.
{* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *}
@@ -17,24 +25,24 @@
///
-### Що таке «Під'єднання» { #what-is-mounting }
+### Що таке «Монтування» { #what-is-mounting }
-«Під'єднання» означає додавання повноцінного «незалежного» застосунку за певним шляхом, який потім обробляє всі під шляхи.
+«Монтування» означає додавання повноцінного «незалежного» застосунку за певним шляхом, який потім відповідає за обробку всіх підшляхів.
-Це відрізняється від використання `APIRouter`, оскільки під'єднаний застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не будуть знати нічого про ваш під'єднаний застосунок тощо.
+Це відрізняється від використання `APIRouter`, оскільки змонтований застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не включатимуть нічого зі змонтованого застосунку тощо.
-Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md).
+Ви можете дізнатися більше про це в [Просунутому посібнику користувача](../advanced/index.md).
## Деталі { #details }
-Перше `"/static"` вказує на під шлях, за яким буде «під'єднано» цей новий «підзастосунок». Тому будь-який шлях, який починається з `"/static"`, буде оброблятися ним.
+Перше `"/static"` стосується підшляху, на якому буде «змонтовано» цей «підзастосунок». Тому будь-який шлях, який починається з `"/static"`, буде оброблятися ним.
`directory="static"` визначає назву каталогу, що містить ваші статичні файли.
-`name="static"` це ім'я, яке можна використовувати всередині **FastAPI**.
+`name="static"` надає йому ім'я, яке можна використовувати всередині **FastAPI**.
Усі ці параметри можуть бути іншими за "`static`", налаштуйте їх відповідно до потреб і особливостей вашого застосунку.
## Додаткова інформація { #more-info }
-Детальніше про налаштування та можливості можна дізнатися в [документації Starlette про статичні файли](https://www.starlette.dev/staticfiles/).
+Для отримання додаткової інформації та параметрів перевірте [документацію Starlette про Static Files](https://www.starlette.dev/staticfiles/).
diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md
index 059e5cec0a..393855a0c4 100644
--- a/docs/uk/docs/tutorial/testing.md
+++ b/docs/uk/docs/tutorial/testing.md
@@ -52,7 +52,7 @@ $ pip install httpx
/// tip | Порада
-Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Async Tests](../advanced/async-tests.md) у розширеному керівництві.
+Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Асинхронні тести](../advanced/async-tests.md) у просунутому навчальному посібнику.
///
@@ -64,7 +64,7 @@ $ pip install httpx
### Файл застосунку **FastAPI** { #fastapi-app-file }
-Припустимо, у вас є структура файлів, описана в розділі [Bigger Applications](bigger-applications.md):
+Припустимо, у вас є структура файлів, описана в розділі [Більші застосунки](bigger-applications.md):
```
.
@@ -130,17 +130,17 @@ $ pip install httpx
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
-Коли вам потрібно передати клієнту інформацію в запиті, але ви не знаєте, як це зробити, ви можете пошукати (Google), як це зробити в `httpx`, або навіть як це зробити з `requests`, оскільки дизайн HTTPX базується на дизайні Requests.
+Коли вам потрібно, щоб клієнт передав інформацію в запиті, але ви не знаєте, як це зробити, ви можете пошукати (Google), як це зробити в `httpx`, або навіть як це зробити з `requests`, оскільки дизайн HTTPX базується на дизайні Requests.
Далі ви просто повторюєте ці ж дії у ваших тестах.
Наприклад:
-* Щоб передати *path* або *query* параметр, додайте його безпосередньо до URL.
+* Щоб передати параметр *шляху* або *запиту*, додайте його безпосередньо до URL.
* Щоб передати тіло JSON, передайте Python-об'єкт (наприклад, `dict`) у параметр `json`.
-* Якщо потрібно надіслати *Form Data* замість JSON, використовуйте параметр `data`.
-* Щоб передати заголовки *headers*, використовуйте `dict` у параметрі `headers`.
-* Для *cookies* використовуйте `dict` у параметрі `cookies`.
+* Якщо потрібно надіслати *дані форми* замість JSON, використовуйте параметр `data`.
+* Щоб передати *заголовки*, використовуйте `dict` у параметрі `headers`.
+* Для *кукі* використовуйте `dict` у параметрі `cookies`.
Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в [документації HTTPX](https://www.python-httpx.org).
@@ -148,7 +148,7 @@ $ pip install httpx
Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі.
-Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md).
+Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON-сумісний кодувальник](encoder.md).
///
diff --git a/docs/uk/docs/virtual-environments.md b/docs/uk/docs/virtual-environments.md
index 26ad6b0cbb..57f3e90df3 100644
--- a/docs/uk/docs/virtual-environments.md
+++ b/docs/uk/docs/virtual-environments.md
@@ -1,6 +1,6 @@
# Віртуальні середовища { #virtual-environments }
-Коли ви працюєте над проєктами Python, вам, імовірно, слід використовувати віртуальне середовище (або схожий механізм), щоб ізолювати пакети, які ви встановлюєте для кожного проєкту.
+Коли ви працюєте над проєктами Python, вам, імовірно, слід використовувати **віртуальне середовище** (або схожий механізм), щоб ізолювати пакети, які ви встановлюєте для кожного проєкту.
/// note | Примітка
@@ -10,19 +10,19 @@
/// tip | Порада
-Віртуальне середовище відрізняється від змінної оточення.
+**Віртуальне середовище** відрізняється від **змінної оточення**.
-Змінна оточення - це змінна в системі, яку можуть використовувати програми.
+**Змінна оточення** - це змінна в системі, яку можуть використовувати програми.
-Віртуальне середовище - це каталог із файлами в ньому.
+**Віртуальне середовище** - це каталог із файлами в ньому.
///
/// note | Примітка
-На цій сторінці ви дізнаєтеся, як використовувати віртуальні середовища і як вони працюють.
+На цій сторінці ви дізнаєтеся, як використовувати **віртуальні середовища** і як вони працюють.
-Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv).
+Якщо ви готові прийняти **інструмент, що керує всім** за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv).
///
@@ -53,11 +53,11 @@ $ cd awesome-project
## Створіть віртуальне середовище { #create-a-virtual-environment }
-Коли ви починаєте працювати над проєктом Python уперше, створіть віртуальне середовище у вашому проєкті **
у вашому проєкті**.
+Коли ви починаєте працювати над проєктом Python **уперше**, створіть віртуальне середовище **
у вашому проєкті**.
/// tip | Порада
-Це потрібно робити лише один раз на проєкт, не щоразу, коли ви працюєте.
+Це потрібно робити лише **один раз на проєкт**, не щоразу, коли ви працюєте.
///
@@ -120,7 +120,7 @@ $ uv venv
/// tip | Порада
-Робіть це щоразу, коли ви починаєте нову сесію термінала для роботи над проєктом.
+Робіть це **щоразу**, коли ви починаєте **нову сесію термінала** для роботи над проєктом.
///
@@ -164,9 +164,9 @@ $ source .venv/Scripts/activate
/// tip | Порада
-Кожного разу, коли ви встановлюєте новий пакет у це середовище, активуйте середовище знову.
+Кожного разу, коли ви встановлюєте **новий пакет** у це середовище, **активуйте** середовище знову.
-Це гарантує, що якщо ви використовуєте програму термінала (
CLI), встановлену цим пакетом, ви використовуєте саме ту з вашого віртуального середовища, а не будь-яку іншу, яка може бути встановлена глобально, імовірно з іншою версією, ніж вам потрібно.
+Це гарантує, що якщо ви використовуєте **програму термінала (
CLI)**, встановлену цим пакетом, ви використовуєте саме ту з вашого віртуального середовища, а не будь-яку іншу, яка може бути встановлена глобально, імовірно з іншою версією, ніж вам потрібно.
///
@@ -176,7 +176,7 @@ $ source .venv/Scripts/activate
/// tip | Порада
-Це необов'язково, але це гарний спосіб перевірити, що все працює як очікується і ви використовуєте саме те віртуальне середовище, яке планували.
+Це **необов'язково**, але це гарний спосіб **перевірити**, що все працює як очікується і ви використовуєте саме те віртуальне середовище, яке планували.
///
@@ -220,13 +220,13 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
///
-Якщо ви використовуєте `pip` для встановлення пакетів (він іде за замовчуванням із Python), вам слід оновити його до найновішої версії.
+Якщо ви використовуєте `pip` для встановлення пакетів (він іде за замовчуванням із Python), вам слід **оновити** його до найновішої версії.
Багато дивних помилок під час встановлення пакета вирішуються тим, що спочатку оновлюють `pip`.
/// tip | Порада
-Зазвичай це роблять один раз, відразу після створення віртуального середовища.
+Зазвичай це роблять **один раз**, відразу після створення віртуального середовища.
///
@@ -264,7 +264,7 @@ $ python -m ensurepip --upgrade
## Додайте `.gitignore` { #add-gitignore }
-Якщо ви використовуєте Git (варто це робити), додайте файл `.gitignore`, щоб виключити з Git усе у вашому `.venv`.
+Якщо ви використовуєте **Git** (варто це робити), додайте файл `.gitignore`, щоб виключити з Git усе у вашому `.venv`.
/// tip | Порада
@@ -274,7 +274,7 @@ $ python -m ensurepip --upgrade
/// tip | Порада
-Зробіть це один раз, відразу після створення віртуального середовища.
+Зробіть це **один раз**, відразу після створення віртуального середовища.
///
@@ -308,9 +308,9 @@ $ echo "*" > .venv/.gitignore
/// tip | Порада
-Робіть це один раз під час встановлення або оновлення пакетів, потрібних вашому проєкту.
+Робіть це **один раз** під час встановлення або оновлення пакетів, потрібних вашому проєкту.
-Якщо вам потрібно оновити версію або додати новий пакет, ви зробите це знову.
+Якщо вам потрібно оновити версію або додати новий пакет, ви **зробите це знову**.
///
@@ -421,13 +421,13 @@ Hello World
/// tip | Порада
-Зазвичай це потрібно робити лише один раз, коли ви створюєте віртуальне середовище.
+Зазвичай це потрібно робити лише **один раз**, коли ви створюєте віртуальне середовище.
///
## Деактивуйте віртуальне середовище { #deactivate-the-virtual-environment }
-Коли ви завершили роботу над проєктом, ви можете деактивувати віртуальне середовище.
+Коли ви завершили роботу над проєктом, ви можете **деактивувати** віртуальне середовище.
@@ -443,6 +443,8 @@ $ deactivate
Тепер ви готові почати працювати над вашим проєктом.
+
+
/// tip | Порада
Хочете зрозуміти, що це все було вище?
@@ -455,33 +457,33 @@ $ deactivate
Щоб працювати з FastAPI, вам потрібно встановити [Python](https://www.python.org/).
-Після цього вам потрібно буде встановити FastAPI та інші пакети, які ви хочете використовувати.
+Після цього вам потрібно буде **встановити** FastAPI та інші **пакети**, які ви хочете використовувати.
Для встановлення пакетів зазвичай використовують команду `pip`, що постачається з Python (або схожі альтернативи).
-Однак, якщо ви просто користуватиметеся `pip` напряму, пакети встановлюватимуться у ваше глобальне середовище Python (глобальну інсталяцію Python).
+Однак, якщо ви просто користуватиметеся `pip` напряму, пакети встановлюватимуться у ваше **глобальне середовище Python** (глобальну інсталяцію Python).
### Проблема { #the-problem }
То в чому ж проблема встановлення пакетів у глобальне середовище Python?
-З часом ви, вірогідно, писатимете багато різних програм, які залежать від різних пакетів. І деякі з цих ваших проєктів залежатимуть від різних версій одного й того ж пакета. 😱
+З часом ви, вірогідно, писатимете багато різних програм, які залежать від **різних пакетів**. І деякі з цих ваших проєктів залежатимуть від **різних версій** одного й того ж пакета. 😱
-Наприклад, ви можете створити проєкт із назвою `philosophers-stone`, ця програма залежить від іншого пакета з назвою `harry`, використовуючи версію `1`. Тож вам потрібно встановити `harry`.
+Наприклад, ви можете створити проєкт із назвою `philosophers-stone`, ця програма залежить від іншого пакета з назвою **`harry`, використовуючи версію `1`**. Тож вам потрібно встановити `harry`.
```mermaid
flowchart LR
stone(philosophers-stone) -->|requires| harry-1[harry v1]
```
-Потім, трохи згодом, ви створюєте інший проєкт із назвою `prisoner-of-azkaban`, і цей проєкт також залежить від `harry`, але йому потрібна версія `harry` `3`.
+Потім, трохи згодом, ви створюєте інший проєкт із назвою `prisoner-of-azkaban`, і цей проєкт також залежить від `harry`, але йому потрібна **версія `harry` `3`**.
```mermaid
flowchart LR
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
```
-Але тепер проблема в тому, що якщо ви встановлюєте пакети глобально (у глобальне середовище), а не у локальне віртуальне середовище, вам доведеться вибирати, яку версію `harry` встановити.
+Але тепер проблема в тому, що якщо ви встановлюєте пакети глобально (у глобальне середовище), а не у локальне **віртуальне середовище**, вам доведеться вибирати, яку версію `harry` встановити.
Якщо ви хочете запустити `philosophers-stone`, вам спочатку потрібно встановити `harry` версії `1`, наприклад, так:
@@ -517,7 +519,7 @@ $ pip install "harry==3"
У підсумку у вас буде встановлено `harry` версії `3` у глобальному середовищі Python.
-А якщо ви знову спробуєте запустити `philosophers-stone`, є шанс, що він не працюватиме, тому що йому потрібен `harry` версії `1`.
+А якщо ви знову спробуєте запустити `philosophers-stone`, є шанс, що він **не працюватиме**, тому що йому потрібен `harry` версії `1`.
```mermaid
flowchart LR
@@ -536,13 +538,13 @@ flowchart LR
/// tip | Порада
-У пакетах Python дуже поширена практика намагатися якнайкраще уникати несумісних змін у нових версіях, але краще підстрахуватися та встановлювати новіші версії свідомо і тоді, коли ви можете запустити тести, щоб перевірити, що все працює коректно.
+У пакетах Python дуже поширена практика намагатися якнайкраще **уникати несумісних змін** у **нових версіях**, але краще підстрахуватися та встановлювати новіші версії свідомо і тоді, коли ви можете запустити тести, щоб перевірити, що все працює коректно.
///
-Тепер уявіть те саме з багатьма іншими пакетами, від яких залежать усі ваші проєкти. Це дуже складно керувати. І ви, імовірно, запускатимете деякі проєкти з деякими несумісними версіями пакетів і не розумітимете, чому щось не працює.
+Тепер уявіть те саме з **багатьма** іншими **пакетами**, від яких залежать усі ваші **проєкти**. Це дуже складно керувати. І ви, імовірно, запускатимете деякі проєкти з деякими **несумісними версіями** пакетів і не розумітимете, чому щось не працює.
-Також, залежно від вашої операційної системи (напр., Linux, Windows, macOS), у ній може бути вже встановлений Python. І в такому разі, імовірно, уже будуть попередньо встановлені деякі пакети з певними версіями, потрібними вашій системі. Якщо ви встановлюєте пакети в глобальне середовище Python, ви можете зламати деякі програми, що постачаються з вашою операційною системою.
+Також, залежно від вашої операційної системи (напр., Linux, Windows, macOS), у ній може бути вже встановлений Python. І в такому разі, імовірно, уже будуть попередньо встановлені деякі пакети з певними версіями, **потрібними вашій системі**. Якщо ви встановлюєте пакети в глобальне середовище Python, ви можете **зламати** деякі програми, що постачаються з вашою операційною системою.
## Де встановлюються пакети { #where-are-packages-installed }
@@ -564,17 +566,17 @@ $ pip install "fastapi[standard]"
Це завантажить стиснений файл з кодом FastAPI, зазвичай із [PyPI](https://pypi.org/project/fastapi/).
-Також будуть завантажені файли для інших пакетів, від яких залежить FastAPI.
+Також будуть **завантажені** файли для інших пакетів, від яких залежить FastAPI.
-Потім усе це буде розпаковано та покладено в каталог на вашому комп'ютері.
+Потім усе це буде **розпаковано** та покладено в каталог на вашому комп'ютері.
-Типово ці завантажені та розпаковані файли будуть покладені в каталог, що постачається з вашою інсталяцією Python, це глобальне середовище.
+Типово ці завантажені та розпаковані файли будуть покладені в каталог, що постачається з вашою інсталяцією Python, це **глобальне середовище**.
## Що таке віртуальні середовища { #what-are-virtual-environments }
-Рішенням проблеми з наявністю всіх пакетів у глобальному середовищі є використання віртуального середовища для кожного проєкту, над яким ви працюєте.
+Рішенням проблеми з наявністю всіх пакетів у глобальному середовищі є використання **віртуального середовища для кожного проєкту**, над яким ви працюєте.
-Віртуальне середовище - це каталог, дуже схожий на глобальний, у якому ви можете встановлювати пакети для конкретного проєкту.
+Віртуальне середовище - це **каталог**, дуже схожий на глобальний, у якому ви можете встановлювати пакети для конкретного проєкту.
Таким чином кожен проєкт матиме власне віртуальне середовище (каталог `.venv`) із власними пакетами.
@@ -637,7 +639,7 @@ $ source .venv/Scripts/activate
////
-Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md), які будуть доступні для наступних команд.
+Ця команда створить або змінить деякі [змінні оточення](environment-variables.md), які будуть доступні для наступних команд.
Однією з цих змінних є змінна `PATH`.
@@ -728,7 +730,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
////
-Важлива деталь: шлях до віртуального середовища буде додано на початок змінної `PATH`. Система знайде його раніше за будь-який інший доступний Python. Таким чином, коли ви запускаєте `python`, використовується саме Python із віртуального середовища, а не будь-який інший `python` (наприклад, з глобального середовища).
+Важлива деталь: шлях до віртуального середовища буде додано на **початок** змінної `PATH`. Система знайде його **раніше** за будь-який інший доступний Python. Таким чином, коли ви запускаєте `python`, використовується саме Python **із віртуального середовища**, а не будь-який інший `python` (наприклад, з глобального середовища).
Активація віртуального середовища також змінює ще кілька речей, але це одна з найважливіших.
@@ -764,11 +766,11 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
////
-Це означає, що програма `python`, яка буде використана, знаходиться у віртуальному середовищі.
+Це означає, що програма `python`, яка буде використана, знаходиться **у віртуальному середовищі**.
На Linux і macOS використовують `which`, а в Windows PowerShell - `Get-Command`.
-Принцип роботи цієї команди в тому, що вона перевіряє змінну оточення `PATH`, проходячи по кожному шляху по порядку, шукаючи програму з назвою `python`. Щойно вона її знайде, вона покаже вам шлях до цієї програми.
+Принцип роботи цієї команди в тому, що вона перевіряє змінну оточення `PATH`, проходячи по **кожному шляху по порядку**, шукаючи програму з назвою `python`. Щойно вона її знайде, вона **покаже вам шлях** до цієї програми.
Найважливіше, що коли ви викликаєте `python`, це рівно той «`python`», який буде виконаний.
@@ -776,9 +778,9 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
/// tip | Порада
-Легко активувати одне віртуальне середовище, отримати один Python, а потім перейти до іншого проєкту.
+Легко активувати одне віртуальне середовище, отримати один Python, а потім **перейти до іншого проєкту**.
-І другий проєкт не працюватиме, бо ви використовуєте некоректний Python з віртуального середовища іншого проєкту.
+І другий проєкт **не працюватиме**, бо ви використовуєте **некоректний Python** з віртуального середовища іншого проєкту.
Корисно вміти перевіряти, який саме `python` використовується. 🤓
@@ -786,9 +788,9 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
## Навіщо деактивувати віртуальне середовище { #why-deactivate-a-virtual-environment }
-Наприклад, ви працюєте над проєктом `philosophers-stone`, активували його віртуальне середовище, встановили пакети та працюєте з цим середовищем.
+Наприклад, ви працюєте над проєктом `philosophers-stone`, **активували його віртуальне середовище**, встановили пакети та працюєте з цим середовищем.
-А потім ви хочете працювати над іншим проєктом `prisoner-of-azkaban`.
+А потім ви хочете працювати над **іншим проєктом** `prisoner-of-azkaban`.
Ви переходите до цього проєкту:
@@ -840,23 +842,23 @@ I solemnly swear 🐺
## Альтернативи { #alternatives }
-Це простий посібник, щоб ви швидко стартували та зрозуміли, як усе працює «під капотом».
+Це простий посібник, щоб ви швидко стартували та зрозуміли, як усе працює **«під капотом»**.
-Існує багато альтернатив керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами.
+Існує багато **альтернатив** керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами.
-Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv).
+Коли будете готові й захочете використовувати інструмент для **керування всім проєктом**, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv).
`uv` уміє багато чого, зокрема:
-* Встановлювати Python для вас, включно з різними версіями
-* Керувати віртуальним середовищем ваших проєктів
-* Встановлювати пакети
-* Керувати залежностями пакетів і версіями у вашому проєкті
-* Гарантувати, що у вас є точний набір пакетів і версій для встановлення, включно з їхніми залежностями, щоб ви були певні, що зможете запустити ваш проєкт у продакшені точно так само, як і на вашому комп'ютері під час розробки - це називається блокуванням
+* **Встановлювати Python** для вас, включно з різними версіями
+* Керувати **віртуальним середовищем** ваших проєктів
+* Встановлювати **пакети**
+* Керувати **залежностями і версіями** пакетів у вашому проєкті
+* Гарантувати, що у вас є **точний** набір пакетів і версій для встановлення, включно з їхніми залежностями, щоб ви були певні, що зможете запустити ваш проєкт у продакшені точно так само, як і на вашому комп'ютері під час розробки - це називається **блокуванням**
* І багато іншого
## Висновок { #conclusion }
-Якщо ви все це прочитали й зрозуміли, тепер ви знаєте значно більше про віртуальні середовища, ніж багато розробників. 🤓
+Якщо ви все це прочитали й зрозуміли, тепер **ви знаєте значно більше** про віртуальні середовища, ніж багато розробників. 🤓
-Знання цих деталей, найімовірніше, стане в пригоді в майбутньому, коли ви налагоджуватимете щось, що виглядає складним, але ви знатимете, як усе працює «під капотом». 😎
+Знання цих деталей, найімовірніше, стане в пригоді в майбутньому, коли ви налагоджуватимете щось, що виглядає складним, але ви знатимете, **як усе працює «під капотом»**. 😎