]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Update translations for uk (update-outdated) (#14587)
authorSebastián Ramírez <tiangolo@gmail.com>
Sun, 11 Jan 2026 00:15:06 +0000 (16:15 -0800)
committerGitHub <noreply@github.com>
Sun, 11 Jan 2026 00:15:06 +0000 (01:15 +0100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
39 files changed:
docs/en/mkdocs.yml
docs/uk/docs/index.md
docs/uk/docs/learn/index.md
docs/uk/docs/python-types.md
docs/uk/docs/tutorial/background-tasks.md
docs/uk/docs/tutorial/body-fields.md
docs/uk/docs/tutorial/body-multiple-params.md
docs/uk/docs/tutorial/body-nested-models.md
docs/uk/docs/tutorial/body-updates.md
docs/uk/docs/tutorial/body.md
docs/uk/docs/tutorial/cookie-param-models.md
docs/uk/docs/tutorial/cookie-params.md
docs/uk/docs/tutorial/cors.md
docs/uk/docs/tutorial/debugging.md
docs/uk/docs/tutorial/encoder.md
docs/uk/docs/tutorial/extra-data-types.md
docs/uk/docs/tutorial/first-steps.md
docs/uk/docs/tutorial/handling-errors.md
docs/uk/docs/tutorial/header-param-models.md
docs/uk/docs/tutorial/header-params.md
docs/uk/docs/tutorial/index.md
docs/uk/docs/tutorial/metadata.md
docs/uk/docs/tutorial/middleware.md
docs/uk/docs/tutorial/path-params-numeric-validations.md
docs/uk/docs/tutorial/path-params.md
docs/uk/docs/tutorial/query-param-models.md
docs/uk/docs/tutorial/query-params-str-validations.md
docs/uk/docs/tutorial/query-params.md
docs/uk/docs/tutorial/request-files.md
docs/uk/docs/tutorial/request-form-models.md
docs/uk/docs/tutorial/request-forms-and-files.md
docs/uk/docs/tutorial/request-forms.md
docs/uk/docs/tutorial/response-model.md
docs/uk/docs/tutorial/response-status-code.md
docs/uk/docs/tutorial/schema-extra-example.md
docs/uk/docs/tutorial/security/index.md
docs/uk/docs/tutorial/static-files.md
docs/uk/docs/tutorial/testing.md
scripts/docs.py

index 66094c81e4fdaec28acc9cc7995277381b8606c2..84255f0f80be513fb42c2fb8ab93addb43c8df5c 100644 (file)
@@ -321,6 +321,8 @@ extra:
     name: pt - português
   - link: /ru/
     name: ru - русский язык
+  - link: /uk/
+    name: uk - українська мова
 extra_css:
 - css/termynal.css
 - css/custom.css
index 0811a4c7bb5b710242f4f626e44689e3c7b31260..526409c5cfe7ff874d6f5a109093bd3def4f99ef 100644 (file)
@@ -1,8 +1,14 @@
+# FastAPI { #fastapi }
+
+<style>
+.md-content .md-typeset h1 { display: none; }
+</style>
+
 <p align="center">
-  <a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
+  <a href="https://fastapi.tiangolo.com/uk"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a>
 </p>
 <p align="center">
-    <em>Ð\93оÑ\82овий Ð´Ð¾ Ð¿Ñ\80одакÑ\88инÑ\83, Ð²Ð¸Ñ\81окопÑ\80одÑ\83кÑ\82ивний, Ð¿Ñ\80оÑ\81Ñ\82ий Ñ\83 Ð²Ð¸Ð²Ñ\87еннÑ\96 Ñ\82а Ñ\88видкий Ð´Ð»Ñ\8f Ð½Ð°Ð¿Ð¸Ñ\81аннÑ\8f ÐºÐ¾Ð´Ñ\83 Ñ\84Ñ\80еймвоÑ\80к</em>
+    <em>ФÑ\80еймвоÑ\80к FastAPI: Ð²Ð¸Ñ\81ока Ð¿Ñ\80одÑ\83кÑ\82ивнÑ\96Ñ\81Ñ\82Ñ\8c, Ð»ÐµÐ³ÐºÐ¾ Ð²Ð¸Ð²Ñ\87аÑ\82и, Ñ\88видко Ð¿Ð¸Ñ\81аÑ\82и ÐºÐ¾Ð´, Ð³Ð¾Ñ\82овий Ð´Ð¾ Ð¿Ñ\80одакÑ\88инÑ\83</em>
 </p>
 <p align="center">
 <a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
 
 ---
 
-**Документація**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a>
+**Документація**: <a href="https://fastapi.tiangolo.com/uk" target="_blank">https://fastapi.tiangolo.com</a>
 
-**Ð\9fÑ\80огÑ\80амний код**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a>
+**Ð\92иÑ\85Ñ\96дний код**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a>
 
 ---
 
-FastAPI - це сучасний, швидкий (високопродуктивний), вебфреймворк для створення API за допомогою Python,в основі якого лежить стандартна анотація типів Python.
+FastAPI — це сучасний, швидкий (високопродуктивний) вебфреймворк для створення API за допомогою Python, що базується на стандартних підказках типів Python.
 
 Ключові особливості:
 
-* **Швидкий**: Дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших фреймворків](#performance).
-
-* **Швидке написання коду**: Пришвидшує розробку функціоналу приблизно на 200%-300%. *
-* **Менше помилок**: Зменшить кількість помилок спричинених людиною (розробником) на 40%. *
-* **Інтуїтивний**: Чудова підтримка редакторами коду. <abbr title="Також відоме як auto-complete, autocompletion, IntelliSense.">Доповнення</abbr> всюди. Зменште час на налагодження.
-* **Простий**: Спроектований, для легкого використання та навчання. Знадобиться менше часу на читання документації.
-* **Короткий**: Зведе до мінімуму дублювання коду. Кожен оголошений параметр може виконувати кілька функцій.
-* **Надійний**: Ви матимете стабільний код готовий до продакшину з автоматичною інтерактивною документацією.
-* **Стандартизований**: Оснований та повністю сумісний з відкритими стандартами для API: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (попередньо відомий як Swagger) та <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
+* **Швидкий**: дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших Python-фреймворків](#performance).
+* **Швидке написання коду**: пришвидшує розробку функціоналу приблизно на 200%–300%. *
+* **Менше помилок**: зменшує приблизно на 40% кількість помилок, спричинених людиною (розробником). *
+* **Інтуїтивний**: чудова підтримка редакторами коду. <abbr title="also known as auto-complete, autocompletion, IntelliSense">Автодоповнення</abbr> всюди. Менше часу на налагодження.
+* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
+* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
+* **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією.
+* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (раніше відомий як Swagger) та <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
 
-<small>* оцінка на основі тестів внутрішньої команди розробників, створення продуктових застосунків.</small>
+<small>* оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки.</small>
 
-## Спонсори
+## Спонсори { #sponsors }
 
 <!-- sponsors -->
 
-{% if sponsors %}
+### Ключовий спонсор { #keystone-sponsor }
+
+{% for sponsor in sponsors.keystone -%}
+<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+{% endfor -%}
+
+### Золоті та срібні спонсори { #gold-and-silver-sponsors }
+
 {% for sponsor in sponsors.gold -%}
 <a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
 {% endfor -%}
 {%- for sponsor in sponsors.silver -%}
 <a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
 {% endfor %}
-{% endif %}
 
 <!-- /sponsors -->
 
-<a href="https://fastapi.tiangolo.com/fastapi-people/#sponsors" class="external-link" target="_blank">Other sponsors</a>
+<a href="https://fastapi.tiangolo.com/uk/fastapi-people/#sponsors" class="external-link" target="_blank">Інші спонсори</a>
 
-## Враження
+## Враження { #opinions }
 
 "_[...] 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._"
 
@@ -88,7 +99,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
 
 "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
 
-<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right:  10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
 
 ---
 
@@ -100,50 +111,54 @@ FastAPI - це сучасний, швидкий (високопродуктив
 
 ---
 
-## **Typer**, FastAPI CLI
+"_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._"
 
-<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
+<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/" target="_blank"><small>(ref)</small></a></div>
 
-Створюючи <abbr title="Command Line Interface">CLI</abbr> застосунок для використання в терміналі, замість веб-API зверніть увагу на <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>.
+---
 
-**Typer** є молодшим братом FastAPI. І це **FastAPI для CLI**. ⌨️ 🚀
+## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary }
 
-## Вимоги
+Наприкінці 2025 року вийшов <a href="https://www.youtube.com/watch?v=mpR8ngthqiE" class="external-link" target="_blank">міні-документальний фільм про FastAPI</a>, ви можете переглянути його онлайн:
 
-FastAPI стоїть на плечах гігантів:
+<a href="https://www.youtube.com/watch?v=mpR8ngthqiE" target="_blank"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
 
-* <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> для web частини.
-* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> для частини даних.
+## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
 
-## Вставновлення
+<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
 
-<div class="termy">
+Якщо ви створюєте застосунок <abbr title="Command Line Interface">CLI</abbr> для використання в терміналі замість веб-API, зверніть увагу на <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>.
 
-```console
-$ pip install fastapi
+**Typer** — молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀
 
----> 100%
-```
+## Вимоги { #requirements }
 
-</div>
+FastAPI стоїть на плечах гігантів:
+
+* <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> для вебчастини.
+* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> для частини даних.
 
-Вам також знадобиться сервер ASGI для продакшину, наприклад <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a> або <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>.
+## Встановлення { #installation }
+
+Створіть і активуйте <a href="https://fastapi.tiangolo.com/uk/virtual-environments/" class="external-link" target="_blank">віртуальне середовище</a>, а потім встановіть FastAPI:
 
 <div class="termy">
 
 ```console
-$ pip install uvicorn[standard]
+$ pip install "fastapi[standard]"
 
 ---> 100%
 ```
 
 </div>
 
-## Приклад
+**Примітка**: переконайтеся, що ви взяли `"fastapi[standard]"` у лапки, щоб це працювало в усіх терміналах.
+
+## Приклад { #example }
 
-### Створіть
+### Створіть { #create-it }
 
-Створіть файл `main.py` з:
+Створіть файл `main.py` з:
 
 ```Python
 from typing import Union
@@ -188,22 +203,35 @@ async def read_item(item_id: int, q: Union[str, None] = None):
 
 **Примітка**:
 
¡Ñ\82икнÑ\83вÑ\88иÑ\81Ñ\8c Ð· Ð¿Ñ\80облемами, Ð½Ðµ Ð·Ð°Ð¹Ð²Ð¸Ð¼ Ð±Ñ\83де Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð¸Ñ\82иÑ\81Ñ\8f Ð· Ñ\80оздÑ\96лом _"In a hurry?"_ Ð¿Ñ\80о <a href="https://fastapi.tiangolo.com/async/#in-a-hurry" target="_blank">`async` та `await` у документації</a>.
¯ÐºÑ\89о Ð²Ð¸ Ð½Ðµ Ð·Ð½Ð°Ñ\94Ñ\82е, Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е Ñ\80оздÑ\96л _"In a hurry?"_ Ð¿Ñ\80о <a href="https://fastapi.tiangolo.com/uk/async/#in-a-hurry" target="_blank">`async` та `await` у документації</a>.
 
 </details>
 
-### Запустіть
+### Запустіть { #run-it }
 
-Запустіть server з:
+Запустіть сервер за допомогою:
 
 <div class="termy">
 
 ```console
-$ uvicorn main:app --reload
-
+$ fastapi dev main.py
+
+ ╭────────── FastAPI CLI - Development mode ───────────╮
+ │                                                     │
+ │  Serving at: http://127.0.0.1:8000                  │
+ │                                                     │
+ │  API docs: http://127.0.0.1:8000/docs               │
+ │                                                     │
+ │  Running in development mode, for production use:   │
+ │                                                     │
+ │  fastapi run                                        │
+ │                                                     │
+ ╰─────────────────────────────────────────────────────╯
+
+INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
 INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-INFO:     Started reloader process [28720]
-INFO:     Started server process [28722]
+INFO:     Started reloader process [2248755] using WatchFiles
+INFO:     Started server process [2248757]
 INFO:     Waiting for application startup.
 INFO:     Application startup complete.
 ```
@@ -211,21 +239,21 @@ INFO:     Application startup complete.
 </div>
 
 <details markdown="1">
-<summary>Про команди <code>uvicorn main:app --reload</code>...</summary>
+<summary>Про команду <code>fastapi dev main.py</code>...</summary>
+
+Команда `fastapi dev` читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>.
 
\9aоманда `uvicorn main:app` Ð¿Ð¾Ñ\81илаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð°:
\97а Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм `fastapi dev` Ð·Ð°Ð¿Ñ\83Ñ\81каÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð· Ð°Ð²Ñ\82о-пеÑ\80езаванÑ\82аженнÑ\8fм Ð´Ð»Ñ\8f Ð»Ð¾ÐºÐ°Ð»Ñ\8cноÑ\97 Ñ\80озÑ\80обки.
 
-* `main`: файл `main.py` ("Модуль" Python).
-* `app`: об’єкт створений усередині `main.py` рядком `app = FastAPI()`.
-* `--reload`: перезапускає сервер після зміни коду. Використовуйте виключно для розробки.
+Докладніше читайте в <a href="https://fastapi.tiangolo.com/uk/fastapi-cli/" target="_blank">документації FastAPI CLI</a>.
 
 </details>
 
-### Перевірте
+### Перевірте { #check-it }
 
\92Ñ\96дкÑ\80ийÑ\82е Ð±Ñ\80аÑ\83зеÑ\80 Ñ\82а Ð²Ð²ÐµÐ´Ñ\96Ñ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81Ñ\83 <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>.
\92Ñ\96дкÑ\80ийÑ\82е Ð±Ñ\80аÑ\83зеÑ\80 Ñ\96 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>.
 
-Ви побачите у відповідь подібний JSON:
+Ви побачите JSON-відповідь:
 
 ```JSON
 {"item_id": 5, "q": "somequery"}
@@ -233,32 +261,32 @@ INFO:     Application startup complete.
 
 Ви вже створили API, який:
 
-* Отримує HTTP запити за _шляхами_ `/` та `/items/{item_id}`.
+* Отримує HTTP-запити за _шляхами_ `/` та `/items/{item_id}`.
 * Обидва _шляхи_ приймають `GET` <em>операції</em> (також відомі як HTTP _методи_).
-* _Шлях_ `/items/{item_id}` містить _параметр шляху_ `item_id` який має бути типу `int`.
+* _Шлях_ `/items/{item_id}` містить _параметр шляху_ `item_id`, який має бути типу `int`.
 * _Шлях_ `/items/{item_id}` містить необовʼязковий `str` _параметр запиту_ `q`.
 
-### Інтерактивні документації API
+### Інтерактивна документація API { #interactive-api-docs }
 
\9fеÑ\80ейдемо Ñ\81Ñ\8eди <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
¢ÐµÐ¿ÐµÑ\80 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
 
-Ви побачите автоматичну інтерактивну API документацію (створену завдяки <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
+Ви побачите автоматичну інтерактивну документацію API (надану <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
 
-### Альтернативні документації API
+### Альтернативна документація API { #alternative-api-docs }
 
¢ÐµÐ¿ÐµÑ\80 Ð¿ÐµÑ\80ейдемо Ñ\81Ñ\8eди <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
\90 Ñ\82епеÑ\80 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
 
-Ви побачите альтернативну автоматичну документацію (створену завдяки  <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
+Ви побачите альтернативну автоматичну документацію (надану <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
-## Приклад оновлення
+## Приклад оновлення { #example-upgrade }
 
-ТепеÑ\80 Ð¼Ð¾Ð´Ð¸Ñ\84Ñ\96кÑ\83йÑ\82е Ñ\84айл `main.py`, Ñ\89об Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 `PUT`.
+ТепеÑ\80 Ð·Ð¼Ñ\96нÑ\96Ñ\82Ñ\8c Ñ\84айл `main.py`, Ñ\89об Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ñ\82Ñ\96ло `PUT`-запиÑ\82Ñ\83.
 
\9eголоÑ\88Ñ\83йÑ\82е Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\85 Ñ\82ипÑ\96в Python завдяки Pydantic.
\9eголоÑ\81Ñ\96Ñ\82Ñ\8c Ñ\82Ñ\96ло, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ñ\82ипи Python, завдяки Pydantic.
 
 ```Python hl_lines="4  9-12  25-27"
 from typing import Union
@@ -290,41 +318,41 @@ def update_item(item_id: int, item: Item):
     return {"item_name": item.name, "item_id": item_id}
 ```
 
-Сервер повинен автоматично перезавантажуватися (тому що Ви додали `--reload` до `uvicorn` команди вище).
+Сервер `fastapi dev` має автоматично перезавантажитися.
 
-### Оновлення інтерактивної API документації
+### Оновлення інтерактивної документації API { #interactive-api-docs-upgrade }
 
-Тепер перейдемо сюди <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
+Тепер перейдіть на <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
 
-* Ð\86нÑ\82еÑ\80акÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f API Ð±Ñ\83де Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð°, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\87и Ð½Ð¾Ð²Ð¸Ð¹ Ð²Ð¼Ñ\96Ñ\81Ñ\82:
+* Ð\86нÑ\82еÑ\80акÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f API Ð±Ñ\83де Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð°, Ð²ÐºÐ»Ñ\8eÑ\87но Ð· Ð½Ð¾Ð²Ð¸Ð¼ Ñ\82Ñ\96лом:
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
 
-* Натисніть кнопку "Try it out", це дозволить вам заповнити параметри та безпосередньо взаємодіяти з API:
+* Натисніть кнопку "Try it out", вона дозволяє заповнити параметри та безпосередньо взаємодіяти з API:
 
 ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png)
 
-* Потім натисніть кнопку "Execute", інтерфейс користувача зв'яжеться з вашим API, надішле параметри, у відповідь отримає результати та покаже їх на екрані:
+* Потім натисніть кнопку "Execute", інтерфейс користувача зв'яжеться з вашим API, надішле параметри, отримає результати та покаже їх на екрані:
 
 ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png)
 
-### Оновлення альтернативної API документації
+### Оновлення альтернативної документації API { #alternative-api-docs-upgrade }
 
\97аÑ\80аз Ð¿ÐµÑ\80ейдемо <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
\90 Ñ\82епеÑ\80 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
 
-* Ð\90лÑ\8cÑ\82еÑ\80наÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ñ\82акож Ð¿Ð¾ÐºÐ°Ð·Ñ\83ваÑ\82име Ð½Ð¾Ð²Ð¸Ð¹ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\96 Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83:
+* Ð\90лÑ\8cÑ\82еÑ\80наÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ñ\82акож Ð²Ñ\96добÑ\80азиÑ\82Ñ\8c Ð½Ð¾Ð²Ð¸Ð¹ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 Ñ\82а Ñ\82Ñ\96ло:
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
 
-### Підсумки
+### Підсумки { #recap }
 
¢Ð°ÐºÐ¸Ð¼ Ñ\87ином, Ð\92и  **один Ñ\80аз** Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ñ\82ипи Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в, Ñ\82Ñ\96ла Ñ\82оÑ\89о, як параметри функції.
\9eÑ\82же, Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е **один Ñ\80аз** Ñ\82ипи Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в, Ñ\82Ñ\96ла Ñ\82оÑ\89о як параметри функції.
 
 Ви робите це за допомогою стандартних сучасних типів Python.
 
 Вам не потрібно вивчати новий синтаксис, методи чи класи конкретної бібліотеки тощо.
 
\92икоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и стандартний **Python**.
\9bиÑ\88е стандартний **Python**.
 
 Наприклад, для `int`:
 
@@ -332,35 +360,35 @@ def update_item(item_id: int, item: Item):
 item_id: int
 ```
 
-або для більш складної моделі `Item`:
+або для складнішої моделі `Item`:
 
 ```Python
 item: Item
 ```
 
-...Ñ\96 Ð· Ñ\86им Ñ\94диним Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8fм Ð\92и отримуєте:
+...Ñ\96 Ð· Ñ\86им Ñ\94диним Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8fм Ð²и отримуєте:
 
-* Ð\9fÑ\96дÑ\82Ñ\80имкÑ\83 Ñ\80едакÑ\82оÑ\80а, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\87и:
-    * Ð\92аÑ\80Ñ\96анÑ\82и Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ\8f.
-    * Перевірку типів.
-* Ð\9fеÑ\80евÑ\96Ñ\80кÑ\83 даних:
-    * Автоматичні та зрозумілі помилки, у разі некоректних даних.
-    * Ð\9fеÑ\80евÑ\96Ñ\80ка Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c Ð´Ð»Ñ\8f JSON Ð· Ð²Ð¸Ñ\81оким Ñ\80Ñ\96внем Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ñ\81Ñ\82Ñ\96.
-* <abbr title="також відомий як: serialization, parsing, marshalling">Перетворення</abbr> вхідних даних: з мережі до даних і типів Python. Читання з:
+* Ð\9fÑ\96дÑ\82Ñ\80имкÑ\83 Ñ\80едакÑ\82оÑ\80а, Ð²ÐºÐ»Ñ\8eÑ\87но Ð·:
+    * Ð\90вÑ\82одоповненнÑ\8fм.
+    * Перевіркою типів.
+* Ð\92алÑ\96даÑ\86Ñ\96Ñ\8e даних:
+    * Автоматичні та зрозумілі помилки, коли дані некоректні.
+    * Ð\92алÑ\96даÑ\86Ñ\96Ñ\8e Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ð³Ð»Ð¸Ð±Ð¾ÐºÐ¾ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ\85 JSON-обʼÑ\94кÑ\82Ñ\96в.
+* <abbr title="also known as: serialization, parsing, marshalling">Перетворення</abbr> вхідних даних: з мережі до даних і типів Python. Читання з:
     * JSON.
     * Параметрів шляху.
     * Параметрів запиту.
     * Cookies.
     * Headers.
     * Forms.
-    * Файлів.
-* <abbr title="також відомий як: serialization, parsing, marshalling">Перетворення</abbr> вихідних даних: з типів і даних Python до мережевих даних (як JSON):
-    * Ð\9aонвеÑ\80Ñ\82аÑ\86Ñ\96Ñ\8f Python Ñ\82ипÑ\96в (`str`, `int`, `float`, `bool`, `list`, тощо).
-    * `datetime` об'єкти.
-    * `UUID` об'єкти.
-    * Моделі бази даних.
+    * Files.
+* <abbr title="also known as: serialization, parsing, marshalling">Перетворення</abbr> вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
+    * Ð\9fеÑ\80еÑ\82воÑ\80еннÑ\8f Ñ\82ипÑ\96в Python (`str`, `int`, `float`, `bool`, `list`, тощо).
+    * Обʼєктів `datetime`.
+    * Обʼєктів `UUID`.
+    * Моделей бази даних.
     * ...та багато іншого.
-* Ð\90вÑ\82омаÑ\82иÑ\87нÑ\83 Ñ\96нÑ\82еÑ\80акÑ\82ивнÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e API, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\87и 2 Ð°Ð»Ñ\8cÑ\82еÑ\80наÑ\82ивнÑ\96 Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81и користувача:
+* Ð\90вÑ\82омаÑ\82иÑ\87нÑ\83 Ñ\96нÑ\82еÑ\80акÑ\82ивнÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e API, Ð²ÐºÐ»Ñ\8eÑ\87но Ð· 2 Ð°Ð»Ñ\8cÑ\82еÑ\80наÑ\82ивними Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81ами користувача:
     * Swagger UI.
     * ReDoc.
 
@@ -368,26 +396,26 @@ item: Item
 
 Повертаючись до попереднього прикладу коду, **FastAPI**:
 
-* Підтвердить наявність `item_id` у шляху для запитів `GET` та `PUT`.
-* Підтвердить, що `item_id` має тип `int` для запитів `GET` and `PUT`.
+* Перевірить, що `item_id` є у шляху для `GET` та `PUT`-запитів.
+* Перевірить, що `item_id` має тип `int` для `GET` та `PUT`-запитів.
     * Якщо це не так, клієнт побачить корисну, зрозумілу помилку.
-* Перевірить, чи є необов'язковий параметр запиту з назвою `q` (а саме `http://127.0.0.1:8000/items/foo?q=somequery`) для запитів `GET`.
+* Перевірить, чи є необов'язковий параметр запиту з назвою `q` (як у `http://127.0.0.1:8000/items/foo?q=somequery`) для `GET`-запитів.
     * Оскільки параметр `q` оголошено як `= None`, він необов'язковий.
-    * Ð\97а Ð²Ñ\96дÑ\81Ñ\83Ñ\82ноÑ\81Ñ\82Ñ\96 `None` Ð²Ñ\96н Ð±Ñ\83в Ð±Ð¸ Ð¾Ð±Ð¾Ð²'Ñ\8fзковим (Ñ\8fк Ñ\96 Ð²Ð¼Ñ\96Ñ\81Ñ\82 у випадку з `PUT`).
-* Для запитів `PUT` із `/items/{item_id}`, читає вміст як JSON:
-    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\87и Ð¼Ð°Ñ\94 Ð¾Ð±Ð¾Ð²'Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `name` Ñ\82ип `str`.
-    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\87и Ð¼Ð°Ñ\94 Ð¾Ð±Ð¾Ð²'Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `price` Ñ\82ип `float`.
-    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\87и Ñ\96Ñ\81нÑ\83Ñ\94 Ð½ÐµÐ¾Ð±Ð¾Ð²'Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `is_offer` Ñ\82а Ñ\87и Ð¼Ð°Ñ\94 Ð²Ñ\96н Ñ\82ип `bool`.
-    * Усе це також працюватиме для глибоко вкладених об'єктів JSON.
-* Ð\90вÑ\82омаÑ\82иÑ\87но ÐºÐ¾Ð½Ð²ÐµÑ\80Ñ\82Ñ\83Ñ\94 Ñ\96з та в JSON.
-* Документує все за допомогою OpenAPI, який може бути використано в:
+    * Ð\91ез `None` Ð²Ñ\96н Ð±Ñ\83в Ð±Ð¸ Ð¾Ð±Ð¾Ð²'Ñ\8fзковим (Ñ\8fк Ñ\96 Ñ\82Ñ\96ло у випадку з `PUT`).
+* Для `PUT`-запитів до `/items/{item_id}` прочитає тіло як JSON:
+    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\89о Ñ\94 Ð¾Ð±Ð¾Ð²Ê¼Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `name`, Ñ\8fкий Ð¼Ð°Ñ\94 Ð±Ñ\83Ñ\82и Ñ\82ипÑ\83 `str`.
+    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\89о Ñ\94 Ð¾Ð±Ð¾Ð²Ê¼Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `price`, Ñ\8fкий Ð¼Ð°Ñ\94 Ð±Ñ\83Ñ\82и Ñ\82ипÑ\83 `float`.
+    * Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c, Ñ\89о Ñ\94 Ð½ÐµÐ¾Ð±Ð¾Ð²Ê¼Ñ\8fзковий Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `is_offer`, Ñ\8fкий Ð¼Ð°Ñ\94 Ð±Ñ\83Ñ\82и Ñ\82ипÑ\83 `bool`, Ñ\8fкÑ\89о Ð²Ñ\96н Ð¿Ñ\80иÑ\81Ñ\83Ñ\82нÑ\96й.
+    * Усе це також працюватиме для глибоко вкладених JSON-обʼєктів.
+* Ð\90вÑ\82омаÑ\82иÑ\87но Ð¿ÐµÑ\80еÑ\82воÑ\80Ñ\8eваÑ\82име з та в JSON.
+* Документуватиме все за допомогою OpenAPI, який може бути використано в:
     * Інтерактивних системах документації.
     * Системах автоматичної генерації клієнтського коду для багатьох мов.
-* Надає безпосередньо 2 вебінтерфейси інтерактивної документації.
+* Надаватиме безпосередньо 2 вебінтерфейси інтерактивної документації.
 
 ---
 
\9cи Ð»Ð¸Ñ\88е Ñ\82Ñ\80Ñ\96Ñ\88ки Ð´Ð¾Ñ\82оÑ\80кнÑ\83лиÑ\81Ñ\8f Ð´Ð¾ ÐºÐ¾Ð´Ñ\83, Ð°Ð»Ðµ Ð\92и Ð²Ð¶Ðµ Ð¼Ð°Ñ\94Ñ\82е Ñ\83Ñ\8fвленнÑ\8f Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ð²се працює.
\9cи Ð»Ð¸Ñ\88е Ñ\82Ñ\80Ñ\96Ñ\88ки Ð´Ð¾Ñ\82оÑ\80кнÑ\83лиÑ\81Ñ\8f Ð´Ð¾ Ð¿Ð¾Ð²ÐµÑ\80Ñ\85нÑ\96, Ð°Ð»Ðµ Ð²Ð¸ Ð²Ð¶Ðµ Ð¼Ð°Ñ\94Ñ\82е Ñ\83Ñ\8fвленнÑ\8f Ð¿Ñ\80о Ñ\82е, Ñ\8fк Ñ\83се працює.
 
 Спробуйте змінити рядок:
 
@@ -407,57 +435,131 @@ item: Item
         ... "item_price": item.price ...
 ```
 
-...Ñ\96 Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е, Ñ\8fк Ð²Ð°Ñ\88 Ñ\80едакÑ\82оÑ\80 Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð·Ð°повнюватиме атрибути та знатиме їхні типи:
+...Ñ\96 Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е, Ñ\8fк Ð²Ð°Ñ\88 Ñ\80едакÑ\82оÑ\80 Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð´Ð¾повнюватиме атрибути та знатиме їхні типи:
 
 ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
 
\94лÑ\8f Ð±Ñ\96лÑ\8cÑ\88 Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ\8f Ð· Ð´Ð¾Ð´Ð°Ñ\82ковими Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8fми, Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е <a href="https://fastapi.tiangolo.com/tutorial/">ТÑ\83Ñ\82оÑ\80Ñ\96ал - Ð\9fоÑ\81Ñ\96бник Ð\9aористувача</a>.
\94лÑ\8f Ð±Ñ\96лÑ\8cÑ\88 Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð¿Ñ\80икладÑ\83, Ñ\89о Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 Ð±Ñ\96лÑ\8cÑ\88е Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ\81Ñ\82ей, Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е <a href="https://fastapi.tiangolo.com/uk/tutorial/">ТÑ\83Ñ\82оÑ\80Ñ\96ал â\80\94 Ð\9fоÑ\81Ñ\96бник Ðºористувача</a>.
 
-**Spoiler alert**: туторіал - посібник користувача містить:
+**Spoiler alert**: туторіал  посібник користувача містить:
 
-* Оголошення **параметрів** з інших місць як: **headers**, **cookies**, **form fields** та **files**.
-* Ð¯Ðº Ð²Ñ\81Ñ\82ановиÑ\82и **пеÑ\80евÑ\96Ñ\80кÑ\83 Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ\8c** як `maximum_length` або `regex`.
-* Дуже потужна і проста у використанні система **<abbr title="також відома як: components, resources, providers, services, injectables">Ін'єкція Залежностей</abbr>**.
-* Безпека та автентифікація, включаючи підтримку **OAuth2** з **JWT tokens** та **HTTP Basic** автентифікацію.
+* Оголошення **параметрів** з інших різних місць, як-от: **headers**, **cookies**, **form fields** та **files**.
+* Ð¯Ðº Ð²Ñ\81Ñ\82ановлÑ\8eваÑ\82и **обмеженнÑ\8f Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\97** як `maximum_length` або `regex`.
+* Дуже потужну і просту у використанні систему **<abbr title="also known as components, resources, providers, services, injectables">Dependency Injection</abbr>**.
+* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth.
 * Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
-* Багато додаткових функцій (завдяки Starlette) як-от:
+* Інтеграцію **GraphQL** з <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> та іншими бібліотеками.
+* Багато додаткових можливостей (завдяки Starlette) як-от:
     * **WebSockets**
     * надзвичайно прості тести на основі HTTPX та `pytest`
     * **CORS**
     * **Cookie Sessions**
     * ...та більше.
 
-## Продуктивність
+### Розгортання застосунку (необовʼязково) { #deploy-your-app-optional }
+
+За бажання ви можете розгорнути ваш застосунок FastAPI у <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>, перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀
+
+Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
+
+Перед розгортанням переконайтеся, що ви ввійшли в систему:
+
+<div class="termy">
+
+```console
+$ fastapi login
+
+You are logged in to FastAPI Cloud 🚀
+```
+
+</div>
+
+Потім розгорніть ваш застосунок:
+
+<div class="termy">
+
+```console
+$ fastapi deploy
+
+Deploying to FastAPI Cloud...
+
+✅ Deployment successful!
+
+🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
+```
+
+</div>
+
+Ось і все! Тепер ви можете отримати доступ до вашого застосунку за цією URL-адресою. ✨
+
+#### Про FastAPI Cloud { #about-fastapi-cloud }
+
+**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** створено тим самим автором і командою, що стоять за **FastAPI**.
+
+Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
+
+Він забезпечує той самий **developer experience** створення застосунків на FastAPI під час їх **розгортання** у хмарі. 🎉
+
+FastAPI Cloud — основний спонсор і джерело фінансування open source проєктів *FastAPI and friends*. ✨
 
-Незалежні тести TechEmpower показують що застосунки **FastAPI**, які працюють під керуванням Uvicorn <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">є одними з найшвидших серед доступних фреймворків в Python</a>, поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*)
+#### Розгортання в інших хмарних провайдерів { #deploy-to-other-cloud-providers }
 
-Щоб дізнатися більше про це, перегляньте розділ <a href="https://fastapi.tiangolo.com/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>.
+FastAPI — open source і базується на стандартах. Ви можете розгортати застосунки FastAPI в будь-якому хмарному провайдері, який ви оберете.
 
-## Необов'язкові залежності
+Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути застосунки FastAPI у нього. 🤓
 
-Pydantic використовує:
+## Продуктивність { #performance }
+
+Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">одні з найшвидших доступних Python-фреймворків</a>, поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*)
+
+Щоб дізнатися більше, перегляньте розділ <a href="https://fastapi.tiangolo.com/uk/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>.
+
+## Залежності { #dependencies }
+
+FastAPI залежить від Pydantic і Starlette.
+
+### Залежності `standard` { #standard-dependencies }
+
+Коли ви встановлюєте FastAPI за допомогою `pip install "fastapi[standard]"`, ви отримуєте групу необовʼязкових залежностей `standard`:
+
+Використовується Pydantic:
 
 * <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - для валідації електронної пошти.
-* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - для управління налаштуваннями.
-* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - для додаткових типів, що можуть бути використані з Pydantic.
 
+Використовується Starlette:
+
+* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - потрібно, якщо ви хочете використовувати `TestClient`.
+* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
+* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - потрібно, якщо ви хочете підтримувати <abbr title="converting the string that comes from an HTTP request into Python data">«parsing»</abbr> форм за допомогою `request.form()`.
 
-Starlette використовує:
+Використовується FastAPI:
 
-* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - Необхідно, якщо Ви хочете використовувати `TestClient`.
-* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - Необхідно, якщо Ви хочете використовувати шаблони як конфігурацію за замовчуванням.
-* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - Необхідно, якщо Ви хочете підтримувати <abbr title="перетворення рядка, який надходить із запиту HTTP, на дані Python">"розбір"</abbr> форми за допомогою `request.form()`.
-* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - Необхідно для підтримки `SessionMiddleware`.
-* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - Необхідно для підтримки Starlette `SchemaGenerator` (ймовірно, вам це не потрібно з FastAPI).
+* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера.
+* `fastapi-cli[standard]` - щоб надати команду `fastapi`.
+    * Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
 
-FastAPI / Starlette використовують:
+### Без залежностей `standard` { #without-standard-dependencies }
+
+Якщо ви не хочете включати необовʼязкові залежності `standard`, ви можете встановити через `pip install fastapi` замість `pip install "fastapi[standard]"`.
+
+### Без `fastapi-cloud-cli` { #without-fastapi-cloud-cli }
+
+Якщо ви хочете встановити FastAPI зі стандартними залежностями, але без `fastapi-cloud-cli`, ви можете встановити через `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
+
+### Додаткові необовʼязкові залежності { #additional-optional-dependencies }
+
+Є ще деякі додаткові залежності, які ви можете захотіти встановити.
+
+Додаткові необовʼязкові залежності Pydantic:
+
+* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - для керування налаштуваннями.
+* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - для додаткових типів, що можуть бути використані з Pydantic.
 
-* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - для сервера, який завантажує та обслуговує вашу програму.
-* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - Необхідно, якщо Ви хочете використовувати `ORJSONResponse`.
-* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - Необхідно, якщо Ви хочете використовувати `UJSONResponse`.
+Додаткові необовʼязкові залежності FastAPI:
 
-Ви можете встановити все це за допомогою `pip install fastapi[all]`.
+* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - потрібно, якщо ви хочете використовувати `ORJSONResponse`.
+* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - потрібно, якщо ви хочете використовувати `UJSONResponse`.
 
-## Ліцензія
+## Ліцензія { #license }
 
 Цей проєкт ліцензовано згідно з умовами ліцензії MIT.
index 7f9f21e572c62a800f2140e8bf57b0077c70d649..6e28d414ad5e2dea705ea90de1a7f83e214cc0e8 100644 (file)
@@ -1,5 +1,5 @@
-# Навчання
+# Навчання { #learn }
 
-У Ñ\86Ñ\8cомÑ\83 Ñ\80оздÑ\96лÑ\96 Ð½Ð°Ð´Ð°Ð½Ñ\96 Ð²Ñ\81Ñ\82Ñ\83пнÑ\96 Ñ\82а Ð½Ð°Ð²Ñ\87алÑ\8cнÑ\96 Ð¼Ð°Ñ\82еÑ\80Ñ\96али Ð´Ð»Ñ\8f Ð²Ð¸Ð²Ñ\87еннÑ\8f FastAPI.
+У Ñ\86Ñ\8cомÑ\83 Ñ\80оздÑ\96лÑ\96 Ð½Ð°Ð´Ð°Ð½Ñ\96 Ð²Ñ\81Ñ\82Ñ\83пнÑ\96 Ñ\80оздÑ\96ли Ñ\82а Ð½Ð°Ð²Ñ\87алÑ\8cнÑ\96 Ð¼Ð°Ñ\82еÑ\80Ñ\96али Ð´Ð»Ñ\8f Ð²Ð¸Ð²Ñ\87еннÑ\8f **FastAPI**.
 
 Це можна розглядати як **книгу**, **курс**, або **офіційний** та рекомендований спосіб освоїти FastAPI. 😎
index 676bafb15ccd9e0fb4e5df9065e371df1143097d..a82d13a2852d7225a0753c1caaf0e314b5aaf6cc 100644 (file)
@@ -1,29 +1,28 @@
-# Вступ до типів Python
+# Вступ до типів Python { #python-types-intro }
 
-Python підтримує додаткові "підказки типу" ("type hints") (також звані "анотаціями типу" ("type annotations")).
+Python підтримує додаткові «підказки типів» (також звані «анотаціями типів»).
 
-Ці **"type hints"** є спеціальним синтаксисом, що дозволяє оголошувати <abbr title="наприклад: str, int, float, bool">тип</abbr> змінної.
+Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати <abbr title="наприклад: str, int, float, bool">тип</abbr> змінної.
 
-За допомогою оголошення типів для ваших змінних, редактори та інструменти можуть надати вам кращу підтримку.
+За допомогою оголошення типів для ваших змінних редактори та інструменти можуть надати вам кращу підтримку.
 
-Це Ð¿Ñ\80оÑ\81Ñ\82о **Ñ\88видкий Ð¿Ð¾Ñ\81Ñ\96бник / Ð½Ð°Ð³Ð°Ð´Ñ\83ваннÑ\8f** Ð¿Ñ\80о Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **FastAPI**... що насправді дуже мало.
+Це Ð»Ð¸Ñ\88е **Ñ\88видкий Ñ\82Ñ\83Ñ\82оÑ\80Ñ\96ал / Ð½Ð°Ð³Ð°Ð´Ñ\83ваннÑ\8f** Ð¿Ñ\80о Ð¿Ñ\96дказки типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **FastAPI**... що насправді дуже мало.
 
-**FastAPI** Ð¿Ð¾Ð²Ð½Ñ\96Ñ\81Ñ\82Ñ\8e Ð±Ð°Ð·Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\86иÑ\85 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8fÑ\85 Ñ\82ипÑ\96в, Ð²Ð¾Ð½Ð¸ Ð´Ð°Ñ\8eÑ\82Ñ\8c Ð¹Ð¾Ð¼Ñ\83 Ð±Ð°Ð³Ð°Ñ\82о Ð¿ÐµÑ\80еваг.
+**FastAPI** Ð¿Ð¾Ð²Ð½Ñ\96Ñ\81Ñ\82Ñ\8e Ð±Ð°Ð·Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\86иÑ\85 Ð¿Ñ\96дказкаÑ\85 Ñ\82ипÑ\96в, Ð²Ð¾Ð½Ð¸ Ð´Ð°Ñ\8eÑ\82Ñ\8c Ð¹Ð¾Ð¼Ñ\83 Ð±Ð°Ð³Ð°Ñ\82о Ð¿ÐµÑ\80еваг Ñ\96 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\96.
 
 Але навіть якщо ви ніколи не використаєте **FastAPI**, вам буде корисно дізнатись трохи про них.
 
-/// note
+/// note | Примітка
 
-Якщо ви експерт у Python і ви вже знаєте усе про анотації типів - перейдіть до наступного розділу.
+Якщо ви експерт у Python і ви вже знаєте все про підказки типів, перейдіть до наступного розділу.
 
 ///
 
-## Мотивація
+## Мотивація { #motivation }
 
 Давайте почнемо з простого прикладу:
 
-{* ../../docs_src/python_types/tutorial001.py *}
-
+{* ../../docs_src/python_types/tutorial001_py39.py *}
 
 Виклик цієї програми виводить:
 
@@ -34,13 +33,12 @@ John Doe
 Функція виконує наступне:
 
 * Бере `first_name` та `last_name`.
-* Конвертує кожну літеру кожного слова у верхній регістр за допомогою `title()`.
-* <abbr title="З’єднує їх, як одне ціле. З вмістом один за одним.">Конкатенує</abbr> їх разом із пробілом по середині.
-
-{* ../../docs_src/python_types/tutorial001.py hl[2] *}
+* Перетворює першу літеру кожного з них у верхній регістр за допомогою `title()`.
+* <abbr title="Об’єднує їх разом, як одне ціле. З вмістом один за одним.">Конкатенує</abbr> їх разом із пробілом по середині.
 
+{* ../../docs_src/python_types/tutorial001_py39.py hl[2] *}
 
-### Редагуйте це
+### Редагуйте це { #edit-it }
 
 Це дуже проста програма.
 
@@ -48,11 +46,11 @@ John Doe
 
 У певний момент ви розпочали б визначення функції, у вас були б готові параметри...
 
-Але тоді вам потрібно викликати "той метод, який переводить першу літеру у верхній регістр".
+Але тоді вам потрібно викликати «той метод, який перетворює першу літеру у верхній регістр».
 
 Це буде `upper`? Чи `uppercase`? `first_uppercase`? `capitalize`?
 
-Тоді ви спробуєте давнього друга програміста - автозаповнення редактора коду.
+Тоді ви спробуєте давнього друга програміста  автозаповнення редактора коду.
 
 Ви надрукуєте перший параметр функції, `first_name`, тоді крапку (`.`), а тоді натиснете `Ctrl+Space`, щоб запустити автозаповнення.
 
@@ -60,7 +58,7 @@ John Doe
 
 <img src="/img/python-types/image01.png">
 
-### Додайте типи
+### Додайте типи { #add-types }
 
 Давайте змінимо один рядок з попередньої версії.
 
@@ -78,10 +76,9 @@ John Doe
 
 Ось і все.
 
-Це "type hints":
-
-{* ../../docs_src/python_types/tutorial002.py hl[1] *}
+Це «підказки типів»:
 
+{* ../../docs_src/python_types/tutorial002_py39.py hl[1] *}
 
 Це не те саме, що оголошення значень за замовчуванням, як це було б з:
 
@@ -91,43 +88,41 @@ John Doe
 
 Це зовсім інше.
 
-Ми використовуємо двокрапку (`:`), не дорівнює (`=`).
\9cи Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94мо Ð´Ð²Ð¾ÐºÑ\80апкÑ\83 (`:`), Ð½Ðµ Ð·Ð½Ð°Ðº Ð´Ð¾Ñ\80Ñ\96внÑ\8eÑ\94 (`=`).
 
\86 Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ\8f Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\83 Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð½Ðµ Ð·Ð¼Ñ\96нÑ\8eÑ\94 Ñ\82ого, Ñ\89о Ñ\81Ñ\82алоÑ\81Ñ\8c Ð±Ð¸ без них.
\86 Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ\8f Ð¿Ñ\96дказок Ñ\82ипÑ\96в Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð½Ðµ Ð·Ð¼Ñ\96нÑ\8eÑ\94 Ñ\82ого, Ñ\89о Ð²Ñ\96дбÑ\83ваÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f, Ð¿Ð¾Ñ\80Ñ\96внÑ\8fно Ð· Ñ\82им, Ñ\89о Ð²Ñ\96дбÑ\83валоÑ\81Ñ\8f Ð± без них.
 
-Але тепер, уявіть що ви посеред процесу створення функції, але з анотаціями типів.
+Але тепер уявіть, що ви знову посеред процесу створення функції, але з підказками типів.
 
\92 Ñ\86ей Ð¶Ðµ Ð¼Ð¾Ð¼ÐµÐ½Ñ\82, Ð²Ð¸ Ñ\81пÑ\80обÑ\83Ñ\94Ñ\82е Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\82и Ð°Ð²Ñ\82озаповненнÑ\8f Ð· допомогою `Ctrl+Space` і побачите:
£ Ñ\82ой Ñ\81амий Ð¼Ð¾Ð¼ÐµÐ½Ñ\82 Ð²Ð¸ Ñ\81пÑ\80обÑ\83Ñ\94Ñ\82е Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\82и Ð°Ð²Ñ\82озаповненнÑ\8f Ð·Ð° допомогою `Ctrl+Space` і побачите:
 
 <img src="/img/python-types/image02.png">
 
-Разом з цим, ви можете прокручувати, переглядати опції, допоки ви не знайдете одну, що звучить схоже:
+Разом з цим ви можете прокручувати, переглядаючи опції, допоки не знайдете ту, що «щось вам підказує»:
 
 <img src="/img/python-types/image03.png">
 
-## Більше мотивації
-
-Перевірте цю функцію, вона вже має анотацію типу:
+## Більше мотивації { #more-motivation }
 
-{* ../../docs_src/python_types/tutorial003.py hl[1] *}
+Перевірте цю функцію, вона вже має підказки типів:
 
+{* ../../docs_src/python_types/tutorial003_py39.py hl[1] *}
 
 Оскільки редактор знає типи змінних, ви не тільки отримаєте автозаповнення, ви також отримаєте перевірку помилок:
 
 <img src="/img/python-types/image04.png">
 
-ТепеÑ\80 Ð²Ð¸ Ð·Ð½Ð°Ñ\94Ñ\82е, Ñ\89об Ð²Ð¸Ð¿Ñ\80авиÑ\82и Ñ\86е, Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и `age` Ñ\83 Ñ\81Ñ\82Ñ\80окÑ\83 Ð· допомогою `str(age)`:
+ТепеÑ\80 Ð²Ð¸ Ð·Ð½Ð°Ñ\94Ñ\82е, Ñ\89об Ð²Ð¸Ð¿Ñ\80авиÑ\82и Ñ\86е, Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и `age` Ñ\83 Ñ\80Ñ\8fдок Ð·Ð° допомогою `str(age)`:
 
-{* ../../docs_src/python_types/tutorial004.py hl[2] *}
+{* ../../docs_src/python_types/tutorial004_py39.py hl[2] *}
 
+## Оголошення типів { #declaring-types }
 
-## Оголошення типів
-
-Щойно ви побачили основне місце для оголошення анотацій типу. Як параметри функції.
+Щойно ви побачили основне місце для оголошення підказок типів. Як параметри функції.
 
 Це також основне місце, де ви б їх використовували у **FastAPI**.
 
-### Прості типи
+### Прості типи { #simple-types }
 
 Ви можете оголошувати усі стандартні типи у Python, не тільки `str`.
 
@@ -138,78 +133,51 @@ John Doe
 * `bool`
 * `bytes`
 
-{* ../../docs_src/python_types/tutorial005.py hl[1] *}
-
+{* ../../docs_src/python_types/tutorial005_py39.py hl[1] *}
 
-### Generic-типи з параметрами типів
+### Generic-типи з параметрами типів { #generic-types-with-type-parameters }
 
 Існують деякі структури даних, які можуть містити інші значення, наприклад `dict`, `list`, `set` та `tuple`. І внутрішні значення також можуть мати свій тип.
 
-Ці типи, які мають внутрішні типи, називаються "**generic**" типами. І оголосити їх можна навіть із внутрішніми типами.
+Ці типи, які мають внутрішні типи, називаються «**generic**» типами. І оголосити їх можна навіть із внутрішніми типами.
 
-Щоб оголосити ці типи та внутрішні типи, ви можете використовувати стандартний модуль Python `typing`. Він існує спеціально для підтримки анотацій типів.
+Щоб оголосити ці типи та внутрішні типи, ви можете використовувати стандартний модуль Python `typing`. Він існує спеціально для підтримки цих підказок типів.
 
-#### Новіші версії Python
+#### Новіші версії Python { #newer-versions-of-python }
 
 Синтаксис із використанням `typing` **сумісний** з усіма версіями, від Python 3.6 до останніх, включаючи Python 3.9, Python 3.10 тощо.
 
-У міру розвитку Python **новіші версії** мають покращену підтримку анотацій типів і в багатьох випадках вам навіть не потрібно буде імпортувати та використовувати модуль `typing` для оголошення анотацій типу.
-
-Якщо ви можете вибрати новішу версію Python для свого проекту, ви зможете скористатися цією додатковою простотою. Дивіться кілька прикладів нижче.
-
-#### List (список)
-
-Наприклад, давайте визначимо змінну, яка буде `list` із `str`.
-
-//// tab | Python 3.8 і вище
-
-З модуля `typing`, імпортуємо `List` (з великої літери `L`):
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
+У міру розвитку Python **новіші версії** мають покращену підтримку цих анотацій типів і в багатьох випадках вам навіть не потрібно буде імпортувати та використовувати модуль `typing` для оголошення анотацій типів.
 
\9eголоÑ\81имо Ð·Ð¼Ñ\96ннÑ\83 Ð· Ñ\82им Ñ\81амим Ñ\81инÑ\82акÑ\81иÑ\81ом Ð´Ð²Ð¾ÐºÑ\80апки (`:`).
¯ÐºÑ\89о Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð±Ñ\80аÑ\82и Ð½Ð¾Ð²Ñ\96Ñ\88Ñ\83 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8e Python Ð´Ð»Ñ\8f Ñ\81вого Ð¿Ñ\80оекÑ\82Ñ\83, Ð²Ð¸ Ð·Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ñ\86Ñ\96Ñ\94Ñ\8e Ð´Ð¾Ð´Ð°Ñ\82ковоÑ\8e Ð¿Ñ\80оÑ\81Ñ\82оÑ\82оÑ\8e.
 
¯Ðº Ñ\82ип Ð²ÐºÐ°Ð¶ÐµÐ¼Ð¾ `List`, Ñ\8fкий Ð²Ð¸ Ñ\96мпоÑ\80Ñ\82Ñ\83вали Ð· `typing`.
£ Ð²Ñ\81Ñ\96й Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 Ñ\94 Ð¿Ñ\80иклади, Ñ\81Ñ\83мÑ\96Ñ\81нÑ\96 Ð· ÐºÐ¾Ð¶Ð½Ð¾Ñ\8e Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\94Ñ\8e Python (коли Ñ\94 Ñ\80Ñ\96зниÑ\86Ñ\8f).
 
\9eÑ\81кÑ\96лÑ\8cки Ñ\81пиÑ\81ок Ñ\94 Ñ\82ипом, Ñ\8fкий Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´ÐµÑ\8fкÑ\96 Ð²Ð½Ñ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\96 Ñ\82ипи, Ð²Ð¸ Ð¿Ð¾Ð¼Ñ\96Ñ\89аÑ\94Ñ\82е Ñ\97Ñ\85 Ñ\83 ÐºÐ²Ð°Ð´Ñ\80аÑ\82нÑ\96 Ð´Ñ\83жки:
\9dапÑ\80иклад, Â«**Python 3.6+**» Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ñ\86е Ñ\81Ñ\83мÑ\96Ñ\81но Ð· Python 3.6 Ð°Ð±Ð¾ Ð²Ð¸Ñ\89е (вклÑ\8eÑ\87но Ð· 3.7, 3.8, 3.9, 3.10 Ñ\82оÑ\89о). Ð\90 Â«**Python 3.9+**» Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ñ\86е Ñ\81Ñ\83мÑ\96Ñ\81но Ð· Python 3.9 Ð°Ð±Ð¾ Ð²Ð¸Ñ\89е (вклÑ\8eÑ\87аÑ\8eÑ\87и 3.10 Ñ\82оÑ\89о).
 
-```Python hl_lines="4"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
+Якщо ви можете використовувати **останні версії Python**, використовуйте приклади для останньої версії — вони матимуть **найкращий і найпростіший синтаксис**, наприклад, «**Python 3.10+**».
 
-////
+#### List { #list }
 
-//// tab | Python 3.9 і вище
+Наприклад, давайте визначимо змінну, яка буде `list` із `str`.
 
-Оголосимо змінну з тим самим синтаксисом двокрапки (`:`).
+Оголосіть змінну з тим самим синтаксисом двокрапки (`:`).
 
-Як тип вкажемо `list`.
+Як тип вкажіть `list`.
 
 Оскільки список є типом, який містить деякі внутрішні типи, ви поміщаєте їх у квадратні дужки:
 
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006_py39.py!}
-```
-
-////
+{* ../../docs_src/python_types/tutorial006_py39.py hl[1] *}
 
-/// info
+/// info | Інформація
 
-Ці внутрішні типи в квадратних дужках називаються "параметрами типу".
+Ці внутрішні типи в квадратних дужках називаються «параметрами типу».
 
-У цьому випадку, `str` це параметр типу переданий у `List` (або `list` у Python 3.9 і вище).
+У цьому випадку `str` — це параметр типу, переданий у `list`.
 
 ///
 
-Це означає: "змінна `items` це `list`, і кожен з елементів у цьому списку - `str`".
-
-/// tip
-
-Якщо ви використовуєте Python 3.9 і вище, вам не потрібно імпортувати `List` з `typing`, ви можете використовувати натомість тип `list`.
-
-///
+Це означає: «змінна `items` — це `list`, і кожен з елементів у цьому списку — `str`».
 
 Зробивши це, ваш редактор може надати підтримку навіть під час обробки елементів зі списку:
 
@@ -221,95 +189,67 @@ John Doe
 
 І все ж редактор знає, що це `str`, і надає підтримку для цього.
 
-#### Tuple and Set (кортеж та набір)
+#### Tuple and Set { #tuple-and-set }
 
 Ви повинні зробити те ж саме, щоб оголосити `tuple` і `set`:
 
-//// tab | Python 3.8 і вище
-
-```Python hl_lines="1  4"
-{!> ../../docs_src/python_types/tutorial007.py!}
-```
-
-////
-
-//// tab | Python 3.9 і вище
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial007_py39.py!}
-```
-
-////
+{* ../../docs_src/python_types/tutorial007_py39.py hl[1] *}
 
 Це означає:
 
-* Змінна `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 параметри типу, розділені комами.
 
-Перший параметр типу для ключа у `dict`.
+Перший параметр типу для ключів у `dict`.
 
-Другий параметр типу для значення у `dict`:
+Другий параметр типу для значень у `dict`:
 
-//// tab | Python 3.8 і вище
-
-```Python hl_lines="1  4"
-{!> ../../docs_src/python_types/tutorial008.py!}
-```
-
-////
-
-//// tab | Python 3.9 і вище
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial008_py39.py!}
-```
-
-////
+{* ../../docs_src/python_types/tutorial008_py39.py hl[1] *}
 
 Це означає:
 
-* Змінна `prices` це `dict`:
-    * Ключі цього `dict` типу `str` (наприклад, назва кожного елементу).
-    * Значення цього `dict` типу `float` (наприклад, ціна кожного елементу).
+* Змінна `prices` — це `dict`:
+    * Ключі цього `dict` мають тип `str` (скажімо, назва кожного елементу).
+    * Значення цього `dict` мають тип `float` (скажімо, ціна кожного елементу).
 
-#### Union (об'єднання)
+#### Union { #union }
 
-Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад, `int` або `str`.
+Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад `int` або `str`.
 
 У Python 3.6 і вище (включаючи Python 3.10) ви можете використовувати тип `Union` з `typing` і вставляти в квадратні дужки можливі типи, які можна прийняти.
 
-У Python 3.10 Ñ\82акож Ñ\94 **алÑ\8cÑ\82еÑ\80наÑ\82ивний синтаксис**, у якому ви можете розділити можливі типи за допомогою <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальної смуги (`|`)</abbr>.
+У Python 3.10 Ñ\82акож Ñ\94 **новий синтаксис**, у якому ви можете розділити можливі типи за допомогою <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальної смуги (`|`)</abbr>.
 
-//// tab | Python 3.8 і вище
+//// tab | Python 3.10+
 
-```Python hl_lines="1  4"
-{!> ../../docs_src/python_types/tutorial008b.py!}
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial008b_py310.py!}
 ```
 
 ////
 
-//// tab | Python 3.10 і вище
+//// tab | Python 3.9+
 
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial008b_py310.py!}
+```Python hl_lines="1  4"
+{!> ../../docs_src/python_types/tutorial008b_py39.py!}
 ```
 
 ////
 
 В обох випадках це означає, що `item` може бути `int` або `str`.
 
-#### Possibly `None` (Optional)
+#### Можливо `None` { #possibly-none }
 
 Ви можете оголосити, що значення може мати тип, наприклад `str`, але також може бути `None`.
 
 У Python 3.6 і вище (включаючи Python 3.10) ви можете оголосити його, імпортувавши та використовуючи `Optional` з модуля `typing`.
 
 ```Python hl_lines="1  4"
-{!../../docs_src/python_types/tutorial009.py!}
+{!../../docs_src/python_types/tutorial009_py39.py!}
 ```
 
 Використання `Optional[str]` замість просто `str` дозволить редактору допомогти вам виявити помилки, коли ви могли б вважати, що значенням завжди є `str`, хоча насправді воно також може бути `None`.
@@ -318,103 +258,128 @@ John Doe
 
 Це також означає, що в Python 3.10 ви можете використовувати `Something | None`:
 
-//// tab | Python 3.8 і вище
+//// tab | Python 3.10+
 
-```Python hl_lines="1  4"
-{!> ../../docs_src/python_types/tutorial009.py!}
+```Python hl_lines="1"
+{!> ../../docs_src/python_types/tutorial009_py310.py!}
 ```
 
 ////
 
-//// tab | Python 3.8 і вище - альтернатива
+//// tab | Python 3.9+
 
 ```Python hl_lines="1  4"
-{!> ../../docs_src/python_types/tutorial009b.py!}
+{!> ../../docs_src/python_types/tutorial009_py39.py!}
 ```
 
 ////
 
-//// tab | Python 3.10 і вище
+//// tab | Python 3.9+ alternative
 
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial009_py310.py!}
+```Python hl_lines="1  4"
+{!> ../../docs_src/python_types/tutorial009b_py39.py!}
 ```
 
 ////
 
-#### Generic типи
+#### Використання `Union` або `Optional` { #using-union-or-optional }
 
¦Ñ\96 Ñ\82ипи, Ñ\8fкÑ\96 Ð¿Ñ\80иймаÑ\8eÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\82ипÑ\83 Ñ\83 ÐºÐ²Ð°Ð´Ñ\80аÑ\82ниÑ\85 Ð´Ñ\83жкаÑ\85, Ð½Ð°Ð·Ð¸Ð²Ð°Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f **Generic types** or **Generics**, Ð½Ð°Ð¿Ñ\80иклад:
¯ÐºÑ\89о Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8e Python Ð½Ð¸Ð¶Ñ\87е 3.10, Ð¾Ñ\81Ñ\8c Ð¿Ð¾Ñ\80ада Ð· Ð¼Ð¾Ñ\94Ñ\97 Ð´Ñ\83же **Ñ\81Ñ\83бâ\80\99Ñ\94кÑ\82ивноÑ\97** Ñ\82оÑ\87ки Ð·Ð¾Ñ\80Ñ\83:
 
-//// tab | Python 3.8 і вище
+* 🚨 Уникайте використання `Optional[SomeType]`
+* Натомість ✨ **використовуйте `Union[SomeType, None]`** ✨.
 
-* `List`
-* `Tuple`
-* `Set`
-* `Dict`
-* `Union`
-* `Optional`
-* ...та інші.
+Обидва варіанти еквівалентні й «під капотом» це одне й те саме, але я рекомендую `Union` замість `Optional`, тому що слово «**optional**» може створювати враження, ніби значення є необов’язковим, хоча насправді це означає «воно може бути `None`», навіть якщо воно не є необов’язковим і все одно є обов’язковим.
 
-////
+Я вважаю, що `Union[SomeType, None]` більш явно показує, що саме мається на увазі.
+
+Це лише про слова й назви. Але ці слова можуть впливати на те, як ви та ваша команда думаєте про код.
 
-//// tab | Python 3.9 і вище
+Як приклад, розгляньмо цю функцію:
 
-Ви можете використовувати ті самі вбудовані типи, як generic (з квадратними дужками та типами всередині):
+{* ../../docs_src/python_types/tutorial009c_py39.py hl[1,4] *}
+
+Параметр `name` визначено як `Optional[str]`, але він **не є необов’язковим**, ви не можете викликати функцію без параметра:
+
+```Python
+say_hi()  # Ой, ні, це викликає помилку! 😱
+```
+
+Параметр `name` **все ще є обов’язковим** (не *optional*), тому що він не має значення за замовчуванням. Водночас `name` приймає `None` як значення:
+
+```Python
+say_hi(name=None)  # Це працює, None є валідним 🎉
+```
+
+Добра новина: щойно ви перейдете на Python 3.10, вам не доведеться про це хвилюватися, адже ви зможете просто використовувати `|` для визначення об’єднань типів:
+
+{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
+
+І тоді вам не доведеться хвилюватися про назви на кшталт `Optional` і `Union`. 😎
+
+#### Generic типи { #generic-types }
+
+Ці типи, які приймають параметри типу у квадратних дужках, називаються **Generic types** or **Generics**, наприклад:
+
+//// tab | Python 3.10+
+
+Ви можете використовувати ті самі вбудовані типи як generic (з квадратними дужками та типами всередині):
 
 * `list`
 * `tuple`
 * `set`
 * `dict`
 
\86 Ñ\82е Ñ\81аме, Ñ\89о Ð¹ Ñ\83 Python 3.8, Ñ\96з модуля `typing`:
\86 Ñ\82ак Ñ\81амо, Ñ\8fк Ñ\96 Ð² Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96Ñ\85 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8fÑ\85 Python, з модуля `typing`:
 
 * `Union`
 * `Optional`
 * ...та інші.
 
+У Python 3.10 як альтернативу використанню generic `Union` та `Optional` ви можете використовувати <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальну смугу (`|`)</abbr> для оголошення об’єднань типів — це значно краще й простіше.
+
 ////
 
-//// tab | Python 3.10 і вище
+//// tab | Python 3.9+
 
-Ви можете використовувати ті самі вбудовані типи, як generic (з квадратними дужками та типами всередині):
+Ви можете використовувати ті самі вбудовані типи як generic (з квадратними дужками та типами всередині):
 
 * `list`
 * `tuple`
 * `set`
 * `dict`
 
-І те саме, що й у Python 3.8, із модуля `typing`:
+І generic з модуля `typing`:
 
 * `Union`
-* `Optional` (так само як у Python 3.8)
+* `Optional`
 * ...та інші.
 
-У Python 3.10, як альтернатива використанню `Union` та `Optional`, ви можете використовувати <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальну смугу (`|`)</abbr> щоб оголосити об'єднання типів.
-
 ////
 
-### Класи як типи
+### Класи як типи { #classes-as-types }
 
 Ви також можете оголосити клас як тип змінної.
 
 Скажімо, у вас є клас `Person` з імʼям:
 
-{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
-
+{* ../../docs_src/python_types/tutorial010_py39.py hl[1:3] *}
 
 Потім ви можете оголосити змінну типу `Person`:
 
-{* ../../docs_src/python_types/tutorial010.py hl[6] *}
-
+{* ../../docs_src/python_types/tutorial010_py39.py hl[6] *}
 
 І знову ж таки, ви отримуєте всю підтримку редактора:
 
 <img src="/img/python-types/image06.png">
 
-## Pydantic моделі
+Зверніть увагу, що це означає: «`one_person` — це **екземпляр** класу `Person`».
 
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> це бібліотека Python для валідації даних.
+Це не означає: «`one_person` — це **клас** з назвою `Person`».
+
+## Pydantic моделі { #pydantic-models }
+
+<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> — це бібліотека Python для валідації даних.
 
 Ви оголошуєте «форму» даних як класи з атрибутами.
 
@@ -424,47 +389,57 @@ John Doe
 
 І ви отримуєте всю підтримку редактора з цим отриманим об’єктом.
 
-Приклад з документації Pydantic:
\9fÑ\80иклад Ð· Ð¾Ñ\84Ñ\96Ñ\86Ñ\96йноÑ\97 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 Pydantic:
 
-//// tab | Python 3.8 і вище
+{* ../../docs_src/python_types/tutorial011_py310.py *}
 
-```Python
-{!> ../../docs_src/python_types/tutorial011.py!}
-```
+/// info | Інформація
 
-////
+Щоб дізнатись більше про <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic, перегляньте його документацію</a>.
 
-//// tab | Python 3.9 і вище
+///
 
-```Python
-{!> ../../docs_src/python_types/tutorial011_py39.py!}
-```
+**FastAPI** повністю базується на Pydantic.
 
-////
+Ви побачите набагато більше цього всього на практиці в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}.
 
-//// tab | Python 3.10 і вище
+/// tip | Порада
 
-```Python
-{!> ../../docs_src/python_types/tutorial011_py310.py!}
-```
+Pydantic має спеціальну поведінку, коли ви використовуєте `Optional` або `Union[Something, None]` без значення за замовчуванням; детальніше про це можна прочитати в документації Pydantic про <a href="https://docs.pydantic.dev/2.3/usage/models/#required-fields" class="external-link" target="_blank">Required Optional fields</a>.
 
-////
+///
 
-/// info
+## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations }
 
©Ð¾Ð± Ð´Ñ\96знаÑ\82иÑ\81Ñ\8c Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic, Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е Ð¹Ð¾Ð³Ð¾ Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e</a>.
£ Python Ñ\82акож Ñ\94 Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96Ñ\81Ñ\82Ñ\8c Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и **додаÑ\82ковÑ\96 <abbr title="Ð\94анÑ\96 Ð¿Ñ\80о Ð´Ð°Ð½Ñ\96, Ñ\83 Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 â\80\94 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8f Ð¿Ñ\80о Ñ\82ип, Ð½Ð°Ð¿Ñ\80иклад Ð¾Ð¿Ð¸Ñ\81.">меÑ\82аданÑ\96</abbr>** Ð´Ð¾ Ñ\86иÑ\85 Ð¿Ñ\96дказок Ñ\82ипÑ\96в Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Annotated`.
 
-///
+Починаючи з Python 3.9, `Annotated` є частиною стандартної бібліотеки, тож ви можете імпортувати його з `typing`.
 
-**FastAPI** повністю базується на Pydantic.
+{* ../../docs_src/python_types/tutorial013_py39.py hl[1,4] *}
 
-Ви побачите набагато більше цього всього на практиці в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}.
+Сам Python нічого не робить із цим `Annotated`. А для редакторів та інших інструментів тип усе ще є `str`.
+
+Але ви можете використати це місце в `Annotated`, щоб надати **FastAPI** додаткові метадані про те, як ви хочете, щоб ваш застосунок поводився.
+
+Важливо пам’ятати, що **перший *параметр типу***, який ви передаєте в `Annotated`, — це **фактичний тип**. Решта — це лише метадані для інших інструментів.
+
+Наразі вам просто потрібно знати, що `Annotated` існує і що це стандартний Python. 😎
+
+Пізніше ви побачите, наскільки **потужним** це може бути.
+
+/// tip | Порада
+
+Той факт, що це **стандартний Python**, означає, що ви й надалі отримуватимете **найкращий можливий досвід розробки** у вашому редакторі, з інструментами, які ви використовуєте для аналізу та рефакторингу коду тощо. ✨
+
+А також те, що ваш код буде дуже сумісним із багатьма іншими інструментами та бібліотеками Python. 🚀
+
+///
 
-## Анотації типів у **FastAPI**
+## Анотації типів у **FastAPI** { #type-hints-in-fastapi }
 
-**FastAPI** використовує ці підказки для виконання кількох речей.
+**FastAPI** використовує ці підказки типів для виконання кількох речей.
 
\97 **FastAPI** Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð· Ð¿Ñ\96дказками Ñ\82ипÑ\83, і отримуєте:
\97 **FastAPI** Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð· Ð¿Ñ\96дказками Ñ\82ипÑ\96в, і отримуєте:
 
 * **Підтримку редактора**.
 * **Перевірку типів**.
@@ -473,17 +448,17 @@ John Doe
 
 * **Визначення вимог**: з параметрів шляху запиту, параметрів запиту, заголовків, тіл, залежностей тощо.
 * **Перетворення даних**: із запиту в необхідний тип.
-* **Ð\9fеÑ\80евÑ\96Ñ\80ка даних**: що надходять від кожного запиту:
+* **Ð\9fеÑ\80евÑ\96Ñ\80ки даних**: що надходять від кожного запиту:
     * Генерування **автоматичних помилок**, що повертаються клієнту, коли дані недійсні.
 * **Документування** API за допомогою OpenAPI:
     * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
 
-Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Туторіал - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
+Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}.
 
 Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас.
 
-/// info
+/// info | Інформація
 
-Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">"шпаргалка" від `mypy`</a>.
+Якщо ви вже пройшли весь туторіал і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">«шпаргалка» від `mypy`</a>.
 
 ///
index 0a9349650d701e02bd9b7bd73049eaac07189155..6d7804195e26326313aeb7431dd69b45c07ce22f 100644 (file)
@@ -1,28 +1,27 @@
-# Фонові задачі
+# Фонові задачі { #background-tasks }
 
 Ви можете створювати фонові задачі, які будуть виконуватися *після* повернення відповіді.
 
 Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді.
 
\9fÑ\80иклади Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f:
¦Ðµ Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94, Ð½Ð°Ð¿Ñ\80иклад:
 
 * Надсилання email-сповіщень після виконання певної дії:
-    * Підключення до поштового сервера та надсилання листа може займати кілька секунд. Ви можете відразу повернути відповідь, а email відправити у фоні.
+    * Підключення до поштового сервера та надсилання листа може займати кілька секунд. Ви можете відразу повернути відповідь, а email-сповіщення надіслати у фоні.
 * Обробка даних:
-    * Ð\9dапÑ\80иклад, Ñ\8fкÑ\89о Ð¾Ñ\82Ñ\80имано Ñ\84айл, Ñ\8fкий Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð±Ñ\80обиÑ\82и Ð´Ð¾Ð²Ð³Ð¾Ñ\82Ñ\80ивалим Ð¿Ñ\80оÑ\86еÑ\81ом, Ð¼Ð¾Ð¶Ð½Ð° Ð¿Ð¾Ð²ÐµÑ\80нÑ\83Ñ\82и Ð²Ñ\96дповÑ\96дÑ\8c "Accepted" ("Ð\9fÑ\80ийнÑ\8fÑ\82о", HTTP 202) і виконати обробку файлу у фоні.
+    * Ð\9dапÑ\80иклад, Ñ\8fкÑ\89о Ð²Ð¸ Ð¾Ñ\82Ñ\80имали Ñ\84айл, Ñ\8fкий Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð±Ñ\80обиÑ\82и Ð´Ð¾Ð²Ð³Ð¾Ñ\82Ñ\80ивалим Ð¿Ñ\80оÑ\86еÑ\81ом, Ð¼Ð¾Ð¶Ð½Ð° Ð¿Ð¾Ð²ÐµÑ\80нÑ\83Ñ\82и Ð²Ñ\96дповÑ\96дÑ\8c Â«Accepted» (HTTP 202) і виконати обробку файлу у фоні.
 
-## Використання `BackgroundTasks`
+## Використання `BackgroundTasks` { #using-backgroundtasks }
 
-СпоÑ\87аÑ\82кÑ\83 Ñ\96мпоÑ\80Ñ\82Ñ\83йÑ\82е `BackgroundTasks` Ñ\96 Ð´Ð¾Ð´Ð°Ð¹Ñ\82е Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\83 Ð\92аÑ\88Ñ\83 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* (path operation function) Ð´Ð¾ `BackgroundTasks`:
+СпоÑ\87аÑ\82кÑ\83 Ñ\96мпоÑ\80Ñ\82Ñ\83йÑ\82е `BackgroundTasks` Ñ\96 Ð¾Ð³Ð¾Ð»Ð¾Ñ\81Ñ\96Ñ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\83 Ð²Ð°Ñ\88Ñ\96й *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð· Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\94Ñ\8e Ñ\82ипÑ\83 `BackgroundTasks`:
 
-{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *}
+{* ../../docs_src/background_tasks/tutorial001_py39.py hl[1,13] *}
 
-**FastAPI** автоматично створить об'єкт `BackgroundTasks` і передасть його у цей параметр.
+**FastAPI** створить для вас об’єкт типу `BackgroundTasks` і передасть його як цей параметр.
 
+## Створення функції задачі { #create-a-task-function }
 
-## Створення функції задачі
-
-Створіть функцію, яка буде виконувати фонову задачу.
+Створіть функцію, яка буде виконуватися як фонова задача.
 
 Це звичайна функція, яка може отримувати параметри.
 
 
 І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`:
 
-{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
+{* ../../docs_src/background_tasks/tutorial001_py39.py hl[6:9] *}
 
-## Додавання фонової задачі
+## Додавання фонової задачі { #add-the-background-task }
 
-УÑ\81еÑ\80единÑ\96 Ð\92аÑ\88оÑ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð±Ñ\80обки шляху*, передайте функцію задачі в об'єкт *background tasks*, використовуючи метод `.add_task()`:
+УÑ\81еÑ\80единÑ\96 Ð²Ð°Ñ\88оÑ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 шляху*, передайте функцію задачі в об'єкт *background tasks*, використовуючи метод `.add_task()`:
 
-{* ../../docs_src/background_tasks/tutorial001.py hl[14] *}
+{* ../../docs_src/background_tasks/tutorial001_py39.py hl[14] *}
 
 `.add_task()` приймає аргументи:
 
-* Ð¤Ñ\83нкÑ\86Ñ\96Ñ\8f Ð·Ð°Ð´Ð°Ñ\87а, Ñ\8fка Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82иÑ\81Ñ\8f Ñ\83 Ñ\84оновомÑ\83 Ñ\80ежимÑ\96 (`write_notification`). Ð\97веÑ\80нÑ\96Ñ\82Ñ\8c Ñ\83вагÑ\83, Ñ\89о Ð¿ÐµÑ\80едаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð¾Ð±Ê¼Ñ\94кÑ\82 Ð±ÐµÐ· Ð´Ñ\83жок.
-* Будь-яка послідовність аргументів, які потрібно передати у функцію завдання у відповідному порядку (`email`).
-* Ð\91Ñ\83дÑ\8c\8fкÑ\96 Ñ\96менованÑ\96 Ð°Ñ\80гÑ\83менÑ\82и, Ñ\8fкÑ\96 Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80едаÑ\82и Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e Ð·Ð°Ð´Ð°Ñ\87Ñ\83 (`message="some notification"`).
+* Ð¤Ñ\83нкÑ\86Ñ\96Ñ\8e Ð·Ð°Ð´Ð°Ñ\87Ñ\96, Ñ\8fка Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82иÑ\81Ñ\8f Ñ\83 Ñ\84оновомÑ\83 Ñ\80ежимÑ\96 (`write_notification`).
+* Будь-яку послідовність аргументів, які потрібно передати у функцію задачі у відповідному порядку (`email`).
+* Ð\91Ñ\83дÑ\8c\8fкÑ\96 Ñ\96менованÑ\96 Ð°Ñ\80гÑ\83менÑ\82и, Ñ\8fкÑ\96 Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80едаÑ\82и Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e Ð·Ð°Ð´Ð°Ñ\87Ñ\96 (`message="some notification"`).
 
-## Впровадження залежностей
+## Впровадження залежностей { #dependency-injection }
 
-Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у під залежності тощо.
+Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у підзалежності тощо.
 
-**FastAPI**  знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту.
+**FastAPI**  знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
 
 {* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
 
 У цьому прикладі повідомлення будуть записані у файл `log.txt` *після* того, як відповідь буде надіслана.
 
-Якщо у запиті був переданий query-параметр, він буде записаний у лог у фоновій задачі.
+Якщо у запиті був переданий query, він буде записаний у лог у фоновій задачі.
 
-А потім інша фонова задача, яка створюється у *функції операції шляху*, запише повідомлення з використанням path параметра `email`.
+А потім інша фонова задача, згенерована у *функції операції шляху*, запише повідомлення з використанням path параметра `email`.
 
-## Технічні деталі
+## Технічні деталі { #technical-details }
 
 Клас `BackgroundTasks` походить безпосередньо з <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>.
 
-Він імпортується безпосередньо у FastAPI, щоб Ви могли використовувати його з `fastapi` і випадково не імпортували `BackgroundTask` (без s в кінці) з `starlette.background`.
+Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`.
 
 Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у *функції операції шляху*, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
 
-Також Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `BackgroundTask` Ð¾ÐºÑ\80емо Ð² FastAPI, Ð°Ð»Ðµ Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð\92ам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
+Також Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `BackgroundTask` Ð¾ÐºÑ\80емо Ð² FastAPI, Ð°Ð»Ðµ Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð²ам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
 
-Детальніше можна почитати в <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">офіційній документації Starlette про фонові задачі </a>.
+Детальніше можна почитати в <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">офіційній документації Starlette про Background Tasks</a>.
 
-## Застереження
+## Застереження { #caveat }
 
-ЯкÑ\89о Ð\92ам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a>.
+ЯкÑ\89о Ð²ам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a>.
 
-ТакÑ\96 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð¿Ð¾Ñ\82Ñ\80ебÑ\83Ñ\8eÑ\82Ñ\8c Ñ\81кладнÑ\96Ñ\88оÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ñ\82а Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ\80а Ñ\87еÑ\80ги Ð¿Ð¾Ð²Ñ\96домленÑ\8c/завданÑ\8c, Ð½Ð°Ð¿Ñ\80иклад, RabbitMQ Ð°Ð±Ð¾ Redis. Ð\9eднак Ð²Ð¾Ð½Ð¸ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\8eÑ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ñ\84оновÑ\96 Ð·Ð°Ð´Ð°Ñ\87Ñ\96 Ð² ÐºÑ\96лÑ\8cкоÑ\85 Ð¿Ñ\80оÑ\86еÑ\81аÑ\85 Ñ\96 Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c на кількох серверах.
+ТакÑ\96 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð¿Ð¾Ñ\82Ñ\80ебÑ\83Ñ\8eÑ\82Ñ\8c Ñ\81кладнÑ\96Ñ\88оÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ñ\82а Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ\80а Ñ\87еÑ\80ги Ð¿Ð¾Ð²Ñ\96домленÑ\8c/завданÑ\8c, Ð½Ð°Ð¿Ñ\80иклад, RabbitMQ Ð°Ð±Ð¾ Redis. Ð\9eднак Ð²Ð¾Ð½Ð¸ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\8eÑ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ñ\84оновÑ\96 Ð·Ð°Ð´Ð°Ñ\87Ñ\96 Ð² ÐºÑ\96лÑ\8cкоÑ\85 Ð¿Ñ\80оÑ\86еÑ\81аÑ\85 Ñ\96 Ð¾Ñ\81обливо â\80\94 на кількох серверах.
 
-ЯкÑ\89о Ð¶ Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имаÑ\82и Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ð·Ð¼Ñ\96нниÑ\85 Ñ\96 Ð¾Ð±â\80\99Ñ\94кÑ\82Ñ\96в Ñ\96з Ñ\82Ñ\96Ñ\94Ñ\97 Ð¶ **FastAPI** - Ð¿Ñ\80огÑ\80ами Ð°Ð±Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð½ÐµÐ²ÐµÐ»Ð¸ÐºÑ\96 Ñ\84оновÑ\96 Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ\8f (напÑ\80иклад, Ð½Ð°Ð´Ñ\81илаÑ\82и Ñ\81повÑ\96Ñ\89еннÑ\8f ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e), достатньо просто використовувати `BackgroundTasks`.
+ЯкÑ\89о Ð¶ Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имаÑ\82и Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ð·Ð¼Ñ\96нниÑ\85 Ñ\96 Ð¾Ð±â\80\99Ñ\94кÑ\82Ñ\96в Ñ\96з Ñ\82Ñ\96Ñ\94Ñ\97 Ð¶ **FastAPI**-пÑ\80огÑ\80ами Ð°Ð±Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð½ÐµÐ²ÐµÐ»Ð¸ÐºÑ\96 Ñ\84оновÑ\96 Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ\8f (напÑ\80иклад, Ð½Ð°Ð´Ñ\81илаÑ\82и email-Ñ\81повÑ\96Ñ\89еннÑ\8f), достатньо просто використовувати `BackgroundTasks`.
 
-## Підсумок
+## Підсумок { #recap }
 
-Імпортуйте та використовуйте `BackgroundTasks` як параметр у *функціях операції шляху* та залежностях, щоб додавати фонові задачі.
+Імпортуйте та використовуйте `BackgroundTasks` як параметри у *функціях операції шляху* та залежностях, щоб додавати фонові задачі.
index 7ddd9d104b5c5a993b2f0c27e358bb49f4772052..70d94f3d6e950e734582e347ff8bdad4226b7c70 100644 (file)
@@ -1,60 +1,61 @@
-# Тіло - Поля
+# Тіло — Поля { #body-fields }
 
-Так Ñ\81амо Ñ\8fк Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ñ\83 Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\85 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð±Ñ\80обки Ñ\88лÑ\8fÑ\85Ñ\83* Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, `Path` Ñ\82а `Body`, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\82и Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ð²Ñ\81еÑ\80единÑ\96 Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Pydantic Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Field` від Pydantic.
+Так Ñ\81амо Ñ\8fк Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ð² Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\85 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, `Path` Ñ\82а `Body`, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ð²Ñ\81еÑ\80единÑ\96 Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Pydantic, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и `Field` від Pydantic.
 
-## Імпорт `Field`
+## Імпорт `Field` { #import-field }
 
 Спочатку вам потрібно імпортувати це:
 
 {* ../../docs_src/body_fields/tutorial001_an_py310.py hl[4] *}
 
-/// warning
 
-Зверніть увагу, що `Field` імпортується прямо з `pydantic`, а не з `fastapi`, як всі інші (`Query`, `Path`, `Body` тощо).
+/// warning | Попередження
+
+Зверніть увагу, що `Field` імпортується безпосередньо з `pydantic`, а не з `fastapi`, як усе інше (`Query`, `Path`, `Body` тощо).
 
 ///
 
-## Оголошення атрибутів моделі
+## Оголошення атрибутів моделі { #declare-model-attributes }
 
\92и можете використовувати `Field` з атрибутами моделі:
\9fоÑ\82Ñ\96м Ð²и можете використовувати `Field` з атрибутами моделі:
 
 {* ../../docs_src/body_fields/tutorial001_an_py310.py hl[11:14] *}
 
-`Field` працює так само, як `Query`, `Path` і `Body`, у нього такі самі параметри тощо.
+`Field` працює так само, як `Query`, `Path` і `Body`, має ті самі параметри тощо.
 
 /// note | Технічні деталі
 
-Насправді, `Query`, `Path` та інші, що ви побачите далі, створюють об'єкти підкласів загального класу `Param`, котрий сам є підкласом класу `FieldInfo` з Pydantic.
+Насправді `Query`, `Path` та інші, які ви побачите далі, створюють об'єкти підкласів спільного класу `Param`, який сам є підкласом класу `FieldInfo` з Pydantic.
 
 І `Field` від Pydantic також повертає екземпляр `FieldInfo`.
 
-`Body` також безпосередньо повертає об'єкти підкласу `FieldInfo`. І є інші підкласи, які ви побачите пізніше, що є підкласами класу Body.
+`Body` також безпосередньо повертає об'єкти підкласу `FieldInfo`. І є інші, які ви побачите пізніше, що є підкласами класу `Body`.
 
-Пам'ятайте, що коли ви імпортуєте 'Query', 'Path' та інше з 'fastapi', вони фактично є функціями, які повертають спеціальні класи.
+Пам'ятайте, що коли ви імпортуєте `Query`, `Path` та інші з `fastapi`, це фактично функції, які повертають спеціальні класи.
 
 ///
 
-/// tip
+/// tip | Порада
 
-Зверніть увагу, що кожен атрибут моделі із типом, значенням за замовчуванням та `Field` має ту саму структуру, що й параметр *функції обробки шляху*, з `Field` замість `Path`, `Query` і `Body`.
+Зверніть увагу, що кожен атрибут моделі з типом, значенням за замовчуванням і `Field` має ту саму структуру, що й параметр *функції операції шляху*, з `Field` замість `Path`, `Query` і `Body`.
 
 ///
 
-## Додавання додаткової інформації
+## Додавання додаткової інформації { #add-extra-information }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ñ\83 `Field`, `Query`, `Body` Ñ\82оÑ\89о. Ð\86 Ð²Ð¾Ð½Ð° Ð±Ñ\83де Ð²ÐºÐ»Ñ\8eÑ\87ена Ñ\83 Ð·Ð³ÐµÐ½ÐµÑ\80ованÑ\83 JSON Ñ\81Ñ\85емÑ\83.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð² `Field`, `Query`, `Body` Ñ\82оÑ\89о. Ð\86 Ð²Ð¾Ð½Ð° Ð±Ñ\83де Ð²ÐºÐ»Ñ\8eÑ\87ена Ð´Ð¾ Ð·Ð³ÐµÐ½ÐµÑ\80ованоÑ\97 JSON Schema.
 
-Ви дізнаєтеся більше про додавання додаткової інформації пізніше у документації, коли вивчатимете визначення прикладів.
+Ви дізнаєтеся більше про додавання додаткової інформації пізніше в документації, коли вивчатимете, як оголошувати приклади.
 
-/// warning
+/// warning | Попередження
 
-Додаткові ключі, передані в `Field`, також будуть присутні у згенерованій схемі OpenAPI для вашого додатка.
-Оскільки ці ключі не обов'язково можуть бути частиною специфікації OpenAPI, деякі інструменти OpenAPI, наприклад, [OpenAPI валідатор](https://validator.swagger.io/), можуть не працювати з вашою згенерованою схемою.
+Додаткові ключі, передані в `Field`, також будуть присутні в отриманій схемі OpenAPI для вашого застосунку.
+Оскільки ці ключі не обов'язково є частиною специфікації OpenAPI, деякі інструменти OpenAPI, наприклад [валідатор OpenAPI](https://validator.swagger.io/), можуть не працювати з вашою згенерованою схемою.
 
 ///
 
-## Підсумок
+## Підсумок { #recap }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `Field` Ð· Pydantic Ð´Ð»Ñ\8f Ð²Ð¸Ð·Ð½Ð°Ñ\87еннÑ\8f Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¿ÐµÑ\80евÑ\96Ñ\80ок Ñ\82а Ð¼ÐµÑ\82аданиÑ\85 для атрибутів моделі.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `Field` Ð²Ñ\96д Pydantic, Ñ\89об Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82а Ð¼ÐµÑ\82аданÑ\96 для атрибутів моделі.
 
-Ви також можете використовувати додаткові іменовані аргументи для передачі додаткових метаданих JSON схеми.
+Ви також можете використовувати додаткові keyword arguments, щоб передавати додаткові метадані JSON Schema.
index e2acf8a703cb256d6067c60b6926ae2fd22da7c6..dc9a768c358698b437edb022eb54259fe8e6855c 100644 (file)
@@ -1,24 +1,24 @@
-# Тіло запиту - Декілька параметрів
+# Тіло - Декілька параметрів { #body-multiple-parameters }
 
-Тепер, коли ми розглянули використання `Path` та `Query`, розгляньмо більш просунуті способи оголошення тіла запиту в **FastAPI**.
+Тепер, коли ми побачили, як використовувати `Path` і `Query`, розгляньмо більш просунуті варіанти оголошення тіла запиту.
 
-## Змішування `Path`, `Query` та параметрів тіла запиту
+## Змішування `Path`, `Query` та параметрів тіла { #mix-path-query-and-body-parameters }
 
\9fо-пеÑ\80Ñ\88е, Ð·Ð²Ñ\96Ñ\81но, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\96лÑ\8cно Ð·Ð¼Ñ\96Ñ\88Ñ\83ваÑ\82и Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в `Path`, `Query` Ñ\82а Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83, Ñ\96 **FastAPI** Ð¿Ñ\80авилÑ\8cно Ñ\97Ñ\85 Ð¾Ð±Ñ\80обиÑ\82Ñ\8c.
\9fо-пеÑ\80Ñ\88е, Ð·Ð²Ñ\96Ñ\81но, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\96лÑ\8cно Ð·Ð¼Ñ\96Ñ\88Ñ\83ваÑ\82и Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в `Path`, `Query` Ñ\82а Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83, Ñ\96 **FastAPI** Ð·Ð½Ð°Ñ\82име, Ñ\89о Ñ\80обиÑ\82и.
 
-Також Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81ити параметри тіла як необов’язкові, встановивши для них значення за замовчуванням `None`:
+Також Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83вати параметри тіла як необов’язкові, встановивши для них значення за замовчуванням `None`:
 
 {* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}
 
 /// note | Примітка
 
-Зверніть увагу, що в цьому випадку параметр `item`, який береться з тіла запиту, є необов'язковим, оскільки має значення за замовчуванням `None`.
+Зверніть увагу, що в цьому випадку параметр `item`, який береться з тіла, є необов'язковим. Оскільки має значення за замовчуванням `None`.
 
 ///
 
-## Декілька параметрів тіла запиту
+## Декілька параметрів тіла { #multiple-body-parameters }
 
-У Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 *опеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\88лÑ\8fÑ\85Ñ\83* Ð¾Ñ\87Ñ\96кÑ\83вала JSON з атрибутами `Item`, наприклад:
+У Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 *опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð¾Ñ\87Ñ\96кÑ\83вали Ð± JSON-Ñ\82Ñ\96ло з атрибутами `Item`, наприклад:
 
 ```JSON
 {
     "tax": 3.2
 }
 ```
-Але Ви також можете оголосити декілька параметрів тіла, наприклад `item` та `user`:
+
+Але ви також можете оголосити декілька параметрів тіла, наприклад `item` та `user`:
 
 {* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *}
 
-У цьому випадку **FastAPI** розпізнає, що є кілька параметрів тіла (два параметри є моделями Pydantic).
 
-Тому він використає назви параметрів як ключі (назви полів) у тілі запиту, очікуючи:
+У цьому випадку **FastAPI** помітить, що у функції є більше ніж один параметр тіла (є два параметри, які є моделями Pydantic).
+
+Тож він використає назви параметрів як ключі (назви полів) у тілі та очікуватиме тіло такого вигляду:
 
 ```JSON
 {
 
 /// note | Примітка
 
-Зверніть увагу, що хоча `item` оголошено, так само як і раніше, тепер він очікується в тілі під ключем  `item`.
+Зверніть увагу, що хоча `item` оголошено так само, як і раніше, тепер він очікується всередині тіла з ключем `item`.
 
 ///
 
-**FastAPI**  автоматично конвертує дані із запиту таким чином, щоб параметр `item` отримав свій вміст, і те ж саме стосується `user`.
+**FastAPI** виконає автоматичне перетворення із запиту, щоб параметр `item` отримав свій конкретний вміст, і те ж саме для `user`.
 
\92Ñ\96н Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\94 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\81кладениÑ\85 Ð´Ð°Ð½Ð¸Ñ\85 Ñ\96 Ð·Ð°Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83Ñ\94 Ñ\97Ñ\85 Ð²Ñ\96дповÑ\96дним чином у схемі OpenAPI та в автоматичній документації.
\92Ñ\96н Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\94 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\81кладениÑ\85 Ð´Ð°Ð½Ð¸Ñ\85 Ñ\96 Ð·Ð°Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83Ñ\94 Ñ\86е Ñ\82аким чином у схемі OpenAPI та в автоматичній документації.
 
-## Одиничні значення в тілі запиту
+## Одиничні значення в тілі { #singular-values-in-body }
 
 Так само як є `Query` і `Path` для визначення додаткових даних для параметрів запиту та шляху, **FastAPI** надає еквівалентний `Body`.
 
-Наприклад, розширюючи попередню модель, Ви можете вирішити додати ще один ключ `importance` в те ж саме тіло запиту разом із `item` і `user`.
+Наприклад, розширивши попередню модель, ви можете вирішити додати ще один ключ `importance` у те саме тіло, окрім `item` і `user`.
 
-ЯкÑ\89о Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82е Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ñ\94, Ñ\82о, Ð¾Ñ\81кÑ\96лÑ\8cки Ñ\86е Ð¾Ð´Ð¸Ð½Ð¸Ñ\87не Ð·Ð½Ð°Ñ\87еннÑ\8f,  **FastAPI**  Ð¿Ñ\80ипÑ\83Ñ\81каÑ\82име, Ñ\89о Ñ\86е Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 (query parameter).
+ЯкÑ\89о Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ñ\94, Ð¾Ñ\81кÑ\96лÑ\8cки Ñ\86е Ð¾Ð´Ð¸Ð½Ð¸Ñ\87не Ð·Ð½Ð°Ñ\87еннÑ\8f, **FastAPI** Ð¿Ñ\80ипÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c, Ñ\89о Ñ\86е Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83.
 
\90ле Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и **FastAPI** Ð¾Ð±Ñ\80облÑ\8fÑ\82и Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ñ\96нÑ\88ий ÐºÐ»Ñ\8eÑ\87 Ñ\82Ñ\96ла (body key), використовуючи `Body`:
\90ле Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и **FastAPI** Ð¾Ð±Ñ\80облÑ\8fÑ\82и Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ñ\96нÑ\88ий ÐºÐ»Ñ\8eÑ\87 Ñ\82Ñ\96ла, використовуючи `Body`:
 
 {* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *}
 
-У цьому випадку **FastAPI** очікуватиме тіло запиту у такому вигляді:
+
+У цьому випадку **FastAPI** очікуватиме тіло такого вигляду:
 
 ```JSON
 {
     "importance": 5
 }
 ```
-Знову ж таки, **FastAPI** конвертуватиме типи даних, перевірятиме їх, створюватиме документацію тощо.
 
-## Декілька body та query параметрів
+Знову ж таки, він перетворюватиме типи даних, перевірятиме, документуватиме тощо.
 
-Звісно, Ви можете оголошувати додаткові query параметри запиту, коли це необхідно, на додаток до будь-яких параметрів тіла запиту.
+## Декілька параметрів тіла та query { #multiple-body-params-and-query }
 
-Оскільки за замовчуванням окремі значення інтерпретуються як параметри запиту, Вам не потрібно явно додавати `Query`, можна просто використати:
+Звісно, ви також можете оголошувати додаткові query параметри щоразу, коли це потрібно, додатково до будь-яких параметрів тіла.
+
+Оскільки за замовчуванням одиничні значення інтерпретуються як параметри запиту, вам не потрібно явно додавати `Query`, ви можете просто зробити:
 
 ```Python
 q: Union[str, None] = None
 ```
 
\90бо Ð² Python 3.10 Ñ\82а вище:
\90бо Ð² Python 3.10 Ñ\96 вище:
 
 ```Python
 q: str | None = None
@@ -115,17 +119,17 @@ q: str | None = None
 
 /// info | Інформація
 
-`Body` також має ті самі додаткові параметри валідації та метаданих, що й `Query`, `Path` та інші, які Ви побачите пізніше.
+`Body` також має всі ті самі додаткові параметри валідації та метаданих, що й `Query`, `Path` та інші, які ви побачите пізніше.
 
 ///
 
-## Ð\92кладений Ð¿Ð¾Ð¾Ð´Ð¸Ð½Ð¾ÐºÐ¸Ð¹ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83
+## Ð\92бÑ\83дÑ\83ваÑ\82и Ð¾Ð´Ð¸Ð½ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\82Ñ\96ла { #embed-a-single-body-parameter }
 
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ð»Ð¸Ñ\88е Ð¾Ð´Ð¸Ð½ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 `item` з моделі Pydantic `Item`.
¡ÐºÐ°Ð¶Ñ\96мо, Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ð»Ð¸Ñ\88е Ð¾Ð´Ð¸Ð½ Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\82Ñ\96ла `item` з моделі Pydantic `Item`.
 
-За замовчуванням **FastAPI** очікуватиме, що тіло запиту міститиме вміст безпосередньо.
+За замовчуванням **FastAPI** очікуватиме його тіло безпосередньо.
 
\90ле Ñ\8fкÑ\89о Ð\92и Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð²Ñ\96н Ð¾Ñ\87Ñ\96кÑ\83вав JSON Ð· ÐºÐ»Ñ\8eÑ\87ем `item`, Ð° Ð²Ñ\81еÑ\80единÑ\96 â\80\94 Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 (Ñ\82ак, Ñ\8fк Ñ\86е Ð²Ñ\96дбÑ\83ваÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð¿Ñ\80и Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\96 Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\82Ñ\96ла), Ð\92и можете використати спеціальний параметр `Body` — `embed`:
\90ле Ñ\8fкÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð²Ñ\96н Ð¾Ñ\87Ñ\96кÑ\83вав JSON Ð· ÐºÐ»Ñ\8eÑ\87ем `item`, Ð° Ð²Ñ\81еÑ\80единÑ\96 Ð½Ñ\8cого â\80\94 Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð¼Ð¾Ð´ÐµÐ»Ñ\96, Ñ\8fк Ñ\86е Ð²Ñ\96дбÑ\83ваÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f, ÐºÐ¾Ð»Ð¸ Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\82Ñ\96ла, Ð²и можете використати спеціальний параметр `Body` — `embed`:
 
 ```Python
 item: Item = Body(embed=True)
@@ -135,7 +139,8 @@ item: Item = Body(embed=True)
 
 {* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *}
 
-У цьому випадку **FastAPI** очікуватиме тіло запиту такого вигляду:
+
+У цьому випадку **FastAPI** очікуватиме тіло такого вигляду:
 
 ```JSON hl_lines="2"
 {
@@ -159,12 +164,12 @@ item: Item = Body(embed=True)
 }
 ```
 
-## Підсумок
+## Підсумок { #recap }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и ÐºÑ\96лÑ\8cка Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\82Ñ\96ла Ð´Ð¾ Ð\92аÑ\88оÑ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* (*path operation function*), навіть якщо запит може мати лише одне тіло.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и ÐºÑ\96лÑ\8cка Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\82Ñ\96ла Ð´Ð¾ Ð²Ð°Ñ\88оÑ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*, навіть якщо запит може мати лише одне тіло.
 
\90ле **FastAPI** Ð¾Ð±Ñ\80обиÑ\82Ñ\8c Ñ\86е, Ð½Ð°Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бнÑ\96 Ð´Ð°Ð½Ñ\96 Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð¿ÐµÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c Ñ\97Ñ\85 Ñ\82а Ð·Ð°Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83Ñ\94 ÐºÐ¾Ñ\80екÑ\82ну схему в *операції шляху*.
\90ле **FastAPI** Ð¾Ð±Ñ\80обиÑ\82Ñ\8c Ñ\86е, Ð½Ð°Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð¼ Ð¿Ñ\80авилÑ\8cнÑ\96 Ð´Ð°Ð½Ñ\96 Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\82а Ð¿ÐµÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c Ñ\96 Ð·Ð°Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83Ñ\94 Ð¿Ñ\80авилÑ\8cну схему в *операції шляху*.
 
-Також Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¾ÐºÑ\80емÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fкÑ\96 Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð¾Ñ\82Ñ\80иманÑ\96 Ñ\8fк Ñ\87аÑ\81Ñ\82ина Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83.
+Також Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¾Ð´Ð¸Ð½Ð¸Ñ\87нÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\89об Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ñ\97Ñ\85 Ñ\8fк Ñ\87аÑ\81Ñ\82инÑ\83 Ñ\82Ñ\96ла.
 
\9aÑ\80Ñ\96м Ñ\82ого, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и **FastAPI**  Ð²Ð±Ñ\83довÑ\83ваÑ\82и Ñ\82Ñ\96ло Ð² ÐºÐ»Ñ\8eÑ\87, Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о оголошено лише один параметр.
\86 Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и **FastAPI** Ð²Ð±Ñ\83довÑ\83ваÑ\82и Ñ\82Ñ\96ло Ð² ÐºÐ»Ñ\8eÑ\87, Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c ÐºÐ¾Ð»Ð¸ оголошено лише один параметр.
index abc33f2eb30743221527f987f4f3dcda8540a3e6..6d0669358a3dccab4915d77e62403d66541d7fc0 100644 (file)
@@ -1,8 +1,8 @@
-# Тіло запиту - Вкладені моделі
+# Тіло - Вкладені моделі { #body-nested-models }
 
\97 **FastAPI** Ð\92и можете визначати, перевіряти, документувати та використовувати моделі, які можуть бути вкладені на будь-яку глибину (завдяки Pydantic).
\97 **FastAPI** Ð²и можете визначати, перевіряти, документувати та використовувати моделі, які можуть бути вкладені на будь-яку глибину (завдяки Pydantic).
 
-## Поля списку
+## Поля списку { #list-fields }
 
 Ви можете визначити атрибут як підтип. Наприклад, Python-список (`list`):
 
 
 Це зробить `tags` списком, хоча не визначається тип елементів списку.
 
-## Поля списку з параметром типу
+## Поля списку з параметром типу { #list-fields-with-type-parameter }
 
-Але Python має специфічний спосіб оголошення списків з внутрішніми типами або "параметрами типу":
-### Імпортуємо `List` з модуля typing
+Але Python має специфічний спосіб оголошення списків з внутрішніми типами або «параметрами типу»:
 
-У Python 3.9 і вище можна використовувати стандартний `list` для оголошення таких типів, як ми побачимо нижче. 💡
+### Оголошення `list` з параметром типу { #declare-a-list-with-a-type-parameter }
 
-Але в Python версії до 3.9 (від 3.6 і вище) спочатку потрібно імпортувати `List` з модуля стандартної бібліотеки Python `typing`:
-
-{* ../../docs_src/body_nested_models/tutorial002.py hl[1] *}
-
-### Оголошення `list` з параметром типу
-
-Щоб оголосити типи з параметрами типу (внутрішніми типами), такими як `list`, `dict`, `tuple`:
-
-* Якщо Ви використовуєте версію Python до 3.9, імпортуйте їх відповідну версію з модуля `typing`.
-* Передайте внутрішні типи як "параметри типу", використовуючи квадратні дужки: `[` and `]`.
-
-У Python 3.9 це буде виглядати так:
+Щоб оголосити типи з параметрами типу (внутрішніми типами), такими як `list`, `dict`, `tuple`,
+передайте внутрішні тип(и) як «параметри типу», використовуючи квадратні дужки: `[` and `]`
 
 ```Python
 my_list: list[str]
 ```
 
-У версіях Python до 3.9 це виглядає так:
-
-```Python
-from typing import List
-
-my_list: List[str]
-```
-
 Це стандартний синтаксис Python для оголошення типів.
 
 Використовуйте той самий стандартний синтаксис для атрибутів моделей з внутрішніми типами.
 
-Отже, у нашому прикладі, ми можемо зробити `tags` саме "списком рядків":
+Отже, у нашому прикладі, ми можемо зробити `tags` саме «списком рядків»:
 
 {* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
 
-## Типи множин
+## Типи множин { #set-types }
 
 Але потім ми подумали, що теги не повинні повторюватися, вони, ймовірно, повинні бути унікальними рядками.
 
@@ -60,29 +41,29 @@ my_list: List[str]
 
 {* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
 
\9dавÑ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð\92и отримаєте запит з дубльованими даними, він буде перетворений у множину унікальних елементів.
\9dавÑ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð²и отримаєте запит з дубльованими даними, він буде перетворений у множину унікальних елементів.
 
\86 ÐºÐ¾Ð»Ð¸ Ð\92и будете виводити ці дані, навіть якщо джерело містить дублікати, вони будуть виведені як множина унікальних елементів.
\86 ÐºÐ¾Ð»Ð¸ Ð²и будете виводити ці дані, навіть якщо джерело містить дублікати, вони будуть виведені як множина унікальних елементів.
 
 І це буде анотовано/документовано відповідно.
 
-## Вкладені моделі
+## Вкладені моделі { #nested-models }
 
 Кожен атрибут моделі Pydantic має тип.
 
 Але цей тип сам може бути іншою моделлю Pydantic.
 
\9eÑ\82же, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð³Ð»Ð¸Ð±Ð¾ÐºÐ¾ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ\96 JSON "об'Ñ\94кÑ\82и" з конкретними іменами атрибутів, типами та перевірками.
\9eÑ\82же, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð³Ð»Ð¸Ð±Ð¾ÐºÐ¾ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ\96 JSON Â«Ð¾Ð±'Ñ\94кÑ\82и» з конкретними іменами атрибутів, типами та перевірками.
 
 Усе це, вкладене без обмежень.
 
-### Визначення підмоделі
+### Визначення підмоделі { #define-a-submodel }
 
 Наприклад, ми можемо визначити модель `Image`:
 
 {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *}
 
-### Використання підмоделі як типу
+### Використання підмоделі як типу { #use-the-submodel-as-a-type }
 
 А потім ми можемо використовувати її як тип атрибута:
 
@@ -104,16 +85,16 @@ my_list: List[str]
 }
 ```
 
\97авдÑ\8fки Ñ\82акÑ\96й Ð´ÐµÐºÐ»Ð°Ñ\80аÑ\86Ñ\96Ñ\97 Ñ\83 **FastAPI** Ð\92и отримуєте:
\97авдÑ\8fки Ñ\82акÑ\96й Ð´ÐµÐºÐ»Ð°Ñ\80аÑ\86Ñ\96Ñ\97 Ñ\83 **FastAPI** Ð²и отримуєте:
 
 * Підтримку в редакторі (автозавершення тощо), навіть для вкладених моделей
 * Конвертацію даних
 * Валідацію даних
 * Автоматичну документацію
 
-## Спеціальні типи та валідація
+## Спеціальні типи та валідація { #special-types-and-validation }
 
\9eкÑ\80Ñ\96м Ð·Ð²Ð¸Ñ\87айниÑ\85 Ñ\82ипÑ\96в, Ñ\82акиÑ\85 Ñ\8fк `str`, `int`, `float`, Ñ\82а Ñ\96н. Ð\92и можете використовувати складніші типи, які наслідують `str`.
\9eкÑ\80Ñ\96м Ð·Ð²Ð¸Ñ\87айниÑ\85 Ñ\82ипÑ\96в, Ñ\82акиÑ\85 Ñ\8fк `str`, `int`, `float`, Ñ\82а Ñ\96н. Ð²и можете використовувати складніші типи, які наслідують `str`.
 
 Щоб побачити всі доступні варіанти, ознайомтеся з оглядом <a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">типів у Pydantic</a>. Деякі приклади будуть у наступних розділах.
 
@@ -123,9 +104,9 @@ my_list: List[str]
 
 Рядок буде перевірено як дійсну URL-адресу і задокументовано в JSON Schema / OpenAPI як URL.
 
-## Атрибути зі списками підмоделей
+## Атрибути зі списками підмоделей { #attributes-with-lists-of-submodels }
 
-У Pydantic Ð\92и можете використовувати моделі як підтипи для `list`, `set` тощо:
+У Pydantic Ð²и можете використовувати моделі як підтипи для `list`, `set` тощо:
 
 {* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
 
@@ -161,7 +142,7 @@ my_list: List[str]
 
 ///
 
-## Глибоко вкладені моделі
+## Глибоко вкладені моделі { #deeply-nested-models }
 
 Ви можете визначати вкладені моделі довільної глибини:
 
@@ -173,14 +154,9 @@ my_list: List[str]
 
 ///
 
-## Тіла запитів, що складаються зі списків
+## Тіла запитів, що складаються зі списків { #bodies-of-pure-lists }
 
-Якщо верхній рівень JSON тіла, яке Ви очікуєте, є JSON `масивом` (у Python — `list`), Ви можете оголосити тип у параметрі функції, як і в моделях Pydantic:
-
-```Python
-images: List[Image]
-```
-або в Python 3.9 і вище:
+Якщо верхній рівень JSON тіла, яке ви очікуєте, є JSON `масивом` (у Python — `list`), ви можете оголосити тип у параметрі функції, як і в моделях Pydantic:
 
 ```Python
 images: list[Image]
@@ -190,7 +166,7 @@ images: list[Image]
 
 {* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *}
 
-## Підтримка в редакторі всюди
+## Підтримка в редакторі всюди { #editor-support-everywhere }
 
 Ви отримаєте підтримку в редакторі всюди.
 
@@ -200,23 +176,23 @@ images: list[Image]
 
 Ви не змогли б отримати таку підтримку в редакторі, якби працювали напряму зі  `dict`, а не з моделями Pydantic.
 
\90ле Ð\92ам не потрібно турбуватися про це: вхідні dict'и автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
\90ле Ð²ам не потрібно турбуватися про це: вхідні dict'и автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
 
-## Тіла з довільними `dict`
+## Тіла з довільними `dict` { #bodies-of-arbitrary-dicts }
 
 Ви також можете оголосити тіло як `dict` з ключами одного типу та значеннями іншого типу.
 
-Це ÐºÐ¾Ñ\80иÑ\81но, Ñ\8fкÑ\89о Ð\92и не знаєте наперед, які імена полів будуть дійсними (як у випадку з моделями Pydantic).
+Це ÐºÐ¾Ñ\80иÑ\81но, Ñ\8fкÑ\89о Ð²и не знаєте наперед, які імена полів будуть дійсними (як у випадку з моделями Pydantic).
 
-Це Ð±Ñ\83де ÐºÐ¾Ñ\80иÑ\81но, Ñ\8fкÑ\89о Ð\92и хочете приймати ключі, які заздалегідь невідомі.
+Це Ð±Ñ\83де ÐºÐ¾Ñ\80иÑ\81но, Ñ\8fкÑ\89о Ð²и хочете приймати ключі, які заздалегідь невідомі.
 
 ---
 
-Це Ñ\82акож Ð·Ñ\80Ñ\83Ñ\87но, Ñ\8fкÑ\89о Ð\92и хочете мати ключі іншого типу (наприклад, `int`).
+Це Ñ\82акож Ð·Ñ\80Ñ\83Ñ\87но, Ñ\8fкÑ\89о Ð²и хочете мати ключі іншого типу (наприклад, `int`).
 
 Ось що ми розглянемо далі.
 
-У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 Ð\92и можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
+У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 Ð²и можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
 
 {* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
 
@@ -228,18 +204,18 @@ images: list[Image]
 
 Це означає, що навіть якщо клієнти вашого API надсилатимуть ключі у вигляді рядків, якщо вони містять цілі числа, Pydantic конвертує їх і проведе валідацію.
 
-ТобÑ\82о `dict`, Ñ\8fкий Ð\92и отримаєте як `weights`, матиме ключі типу `int` та значення типу `float`.
+ТобÑ\82о `dict`, Ñ\8fкий Ð²и отримаєте як `weights`, матиме ключі типу `int` та значення типу `float`.
 
 ///
 
-## Підсумок
+## Підсумок { #recap }
 
\97 **FastAPI** Ð\92и маєте максимальну гнучкість завдяки моделям Pydantic, зберігаючи при цьому код простим, коротким та елегантним.
\97 **FastAPI** Ð²и маєте максимальну гнучкість завдяки моделям Pydantic, зберігаючи при цьому код простим, коротким та елегантним.
 
 А також отримуєте всі переваги:
 
 * Підтримка в редакторі (автодоповнення всюди!)
 * Конвертація даних (парсинг/сериалізація)
-* Ð\92алÑ\96даÑ\86Ñ\96Ñ\8f даних
+* Ð\92алÑ\96даÑ\86Ñ\96Ñ\8e даних
 * Документація схем
 * Автоматичне створення документації
index e78b5a5bf3463ae788534124a25e5aa3fd160322..2ae68291ca3a4416cad974dcc8a9c965713bea29 100644 (file)
@@ -1,8 +1,8 @@
-# Ð¢Ñ\96ло â\80\93 Ð\9eновленнÑ\8f
+# Ð¢Ñ\96ло â\80\94 Ð\9eновленнÑ\8f { #body-updates }
 
-## Оновлення з використанням `PUT`
+## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put }
 
-Щоб Ð¾Ð½Ð¾Ð²Ð¸Ñ\82и ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82, Ð\92и можете використати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> операцію.
+Щоб Ð¾Ð½Ð¾Ð²Ð¸Ñ\82и ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82, Ð²и можете використати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> операцію.
 
 Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`.
 
@@ -10,7 +10,7 @@
 
 `PUT` використовується для отримання даних, які мають замінити чинні дані.
 
-### Попередження про заміну
+### Попередження про заміну { #warning-about-replacing }
 
 Це означає, що якщо Ви хочете оновити елемент `bar`, використовуючи `PUT` з тілом:
 
@@ -26,7 +26,7 @@
 
 І дані будуть збережені з цим "новим" значенням `tax` = `10.5`.
 
-## Часткові оновлення з `PATCH`
+## Часткові оновлення з `PATCH` { #partial-updates-with-patch }
 
 Ви також можете використовувати операцію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> для *часткового* оновлення даних.
 
 
 /// note | Примітка
 
-`PATCH` Ð¼ÐµÐ½Ñ\88 Ð²Ñ\96домий Ñ\96 Ñ\80Ñ\96дÑ\88е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f, ніж `PUT`.
+`PATCH` Ð¼ÐµÐ½Ñ\88 Ð¿Ð¾Ñ\88иÑ\80ений Ñ\96 Ð¼ÐµÐ½Ñ\88 Ð²Ñ\96домий, ніж `PUT`.
 
 І багато команд використовують лише `PUT`, навіть для часткових оновлень.
 
-Ви **вільні** використовувати їх так, як хочете, **FastAPI** не накладає обмежень.
\92и **вÑ\96лÑ\8cнÑ\96** Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\97Ñ\85 Ñ\82ак, Ñ\8fк Ñ\85оÑ\87еÑ\82е, **FastAPI** Ð½Ðµ Ð½Ð°ÐºÐ»Ð°Ð´Ð°Ñ\94 Ð¶Ð¾Ð´Ð½Ð¸Ñ\85 Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ\8c.
 
\90ле Ñ\86ей Ð¿Ð¾Ñ\81Ñ\96бник Ð¿Ð¾ÐºÐ°Ð·Ñ\83Ñ\94 Ð\92ам Ð±Ñ\96лÑ\8cÑ\88-менÑ\88 як їх задумано використовувати.
\90ле Ñ\86ей Ð¿Ð¾Ñ\81Ñ\96бник Ð¿Ð¾ÐºÐ°Ð·Ñ\83Ñ\94 Ð²Ð°Ð¼, Ð±Ñ\96лÑ\8cÑ\88-менÑ\88, як їх задумано використовувати.
 
 ///
 
-### Використання параметра `exclude_unset` у Pydantic
+### Використання параметра `exclude_unset` у Pydantic { #using-pydantics-exclude-unset-parameter }
 
-Якщо Ви хочете отримати часткові оновлення, дуже зручно використовувати параметр `exclude_unset` у методі `.model_dump()` моделі Pydantic.
+Якщо Ви хочете отримувати часткові оновлення, дуже корисно використовувати параметр `exclude_unset` у `.model_dump()` моделі Pydantic.
 
 Наприклад: `item.model_dump(exclude_unset=True)`.
 
-/// info | Інформація
+Це згенерує `dict` лише з тими даними, які були встановлені під час створення моделі `item`, виключаючи значення за замовчуванням.
 
-У Pydantic v1 цей метод називався `.dict()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_dump()`.
-
-Приклади тут використовують `.dict()` для сумісності з Pydantic v1, але Вам слід використовувати `.model_dump()`, якщо можете використовувати Pydantic v2.
-
-///
-
-Це створить `dict` лише з тими даними, які були явно встановлені під час створення моделі `item`, виключаючи значення за замовчуванням.
-
-Тоді Ви можете використовувати це, щоб створити `dict` лише з даними, які були встановлені (надіслані у запиті), пропускаючи значення за замовчуванням:
+Тоді Ви можете використовувати це, щоб згенерувати `dict` лише з даними, які були встановлені (надіслані у запиті), пропускаючи значення за замовчуванням:
 
 {* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
 
-### Використання параметра `update` у Pydantic
+### Використання параметра `update` у Pydantic { #using-pydantics-update-parameter }
 
-Тепер Ви можете створити копію наявної моделі за допомогою `.model_copy()`, і передати параметр `update` з `dict` , який містить дані для оновлення.
-
-/// info | Інформація
-
-У Pydantic v1 метод називався `.copy()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_copy()`.
-
-Приклади тут використовують `.copy()` для сумісності з Pydantic v1, але якщо Ви можете використовувати Pydantic v2 — Вам слід використовувати `.model_copy()` замість цього.
-
-///
+Тепер Ви можете створити копію наявної моделі за допомогою `.model_copy()`, і передати параметр `update` з `dict`, який містить дані для оновлення.
 
 Наприклад: `stored_item_model.model_copy(update=update_data)`:
 
 {* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
 
-### Підсумок часткових оновлень
+### Підсумок часткових оновлень { #partial-updates-recap }
 
 У підсумку, щоб застосувати часткові оновлення, Ви:
 
 
 Насправді Ви можете використовувати цю саму техніку і з операцією HTTP `PUT`.
 
-Але приклад тут використовує `PATCH`, тому що він був створений саме для таких випадків.
+Але приклад тут використовує `PATCH`, тому що він був створений для таких випадків.
 
 ///
 
 
 Зверніть увагу, що модель запиту все ще проходить валідацію.
 
-Тож, Ñ\8fкÑ\89о Ð\92и Ñ\85оÑ\87еÑ\82е Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ñ\87аÑ\81Ñ\82ковÑ\96 Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f, Ñ\8fкÑ\96 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð½Ðµ Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Ð¶Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð°Ñ\82Ñ\80ибÑ\83Ñ\82а, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
+Тож, Ñ\8fкÑ\89о Ð\92и Ñ\85оÑ\87еÑ\82е Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ñ\87аÑ\81Ñ\82ковÑ\96 Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f, Ñ\8fкÑ\96 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð¿Ñ\80опÑ\83Ñ\81каÑ\82и Ð²Ñ\81Ñ\96 Ð°Ñ\82Ñ\80ибÑ\83Ñ\82и, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
 
 Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}.
 
index 38fed7bb8d205262db6bcf7bd054bc91a6d834f9..ca1f308ab5495b932df0a0f9acdeb6a6b83398e5 100644 (file)
@@ -1,14 +1,14 @@
-# Тіло запиту
+# Тіло запиту { #request-body }
 
 Коли вам потрібно надіслати дані з клієнта (скажімо, браузера) до вашого API, ви надсилаєте їх як **тіло запиту**.
 
 Тіло **запиту** — це дані, надіслані клієнтом до вашого API. Тіло **відповіді** — це дані, які ваш API надсилає клієнту.
 
-Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів**.
+Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** — інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
 
 Щоб оголосити тіло **запиту**, ви використовуєте <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> моделі з усією їх потужністю та перевагами.
 
-/// info
+/// info | Інформація
 
 Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`.
 
 
 ///
 
-## Імпортуйте `BaseModel` від Pydantic
+## Імпортуйте `BaseModel` від Pydantic { #import-pydantics-basemodel }
 
 Спочатку вам потрібно імпортувати `BaseModel` з `pydantic`:
 
-{* ../../docs_src/body/tutorial001.py hl[4] *}
+{* ../../docs_src/body/tutorial001_py310.py hl[2] *}
 
-## Створіть свою модель даних
+## Створіть свою модель даних { #create-your-data-model }
 
 Потім ви оголошуєте свою модель даних як клас, який успадковується від `BaseModel`.
 
 Використовуйте стандартні типи Python для всіх атрибутів:
 
-{* ../../docs_src/body/tutorial001.py hl[7:11] *}
+{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
 
-Так само, як і при оголошенні параметрів запиту, коли атрибут моделі має значення за замовчуванням, він не є обов’язковим. В іншому випадку це потрібно. Використовуйте `None`, щоб зробити його необов'язковим.
+
+Так само, як і при оголошенні параметрів запиту, коли атрибут моделі має значення за замовчуванням, він не є обов’язковим. В іншому випадку це потрібно. Використовуйте `None`, щоб зробити його просто необов'язковим.
 
 Наприклад, ця модель вище оголошує JSON "`об'єкт`" (або Python `dict`), як:
 
 }
 ```
 
-## Оголоси її як параметр
+## Оголосіть її як параметр { #declare-it-as-a-parameter }
 
 Щоб додати модель даних до вашої *операції шляху*, оголосіть її так само, як ви оголосили параметри шляху та запиту:
 
-{* ../../docs_src/body/tutorial001.py hl[18] *}
+{* ../../docs_src/body/tutorial001_py310.py hl[16] *}
 
 ...і вкажіть її тип як модель, яку ви створили, `Item`.
 
-## Результати
+## Результати { #results }
 
 Лише з цим оголошенням типу Python **FastAPI** буде:
 
@@ -73,9 +74,9 @@
 * Надавати отримані дані у параметрі `item`.
     * Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів.
 * Генерувати <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> визначення для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту.
-* Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією інтерфейсу користувача.
+* Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією <abbr title="User Interfaces – Інтерфейси користувача">UIs</abbr>.
 
-## Автоматична документація
+## Автоматична документація { #automatic-docs }
 
 Схеми JSON ваших моделей будуть частиною вашої схеми, згенерованої OpenAPI, і будуть показані в інтерактивній API документації:
 
@@ -85,7 +86,7 @@
 
 <img src="/img/tutorial/body/image02.png">
 
-## Підтримка редактора
+## Підтримка редактора { #editor-support }
 
 У вашому редакторі, всередині вашої функції, ви будете отримувати підказки типу та завершення скрізь (це б не сталося, якби ви отримали `dict` замість моделі Pydantic):
 
 
 <img src="/img/tutorial/body/image05.png">
 
-/// tip
+/// tip | Порада
 
 Якщо ви використовуєте <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> як ваш редактор, ви можете використати <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>.
 
 
 ///
 
-## Використовуйте модель
+## Використовуйте модель { #use-the-model }
 
 Усередині функції ви можете отримати прямий доступ до всіх атрибутів об’єкта моделі:
 
-{* ../../docs_src/body/tutorial002.py hl[21] *}
+{* ../../docs_src/body/tutorial002_py310.py *}
 
-## Тіло запиту + параметри шляху
+## Тіло запиту + параметри шляху { #request-body-path-parameters }
 
 Ви можете одночасно оголошувати параметри шляху та тіло запиту.
 
 **FastAPI** розпізнає, що параметри функції, які відповідають параметрам шляху, мають бути **взяті з шляху**, а параметри функції, які оголошуються як моделі Pydantic, **взяті з тіла запиту**.
 
-{* ../../docs_src/body/tutorial003.py hl[17:18] *}
+{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
+
 
-## Тіло запиту + шлях + параметри запиту
+## Тіло запиту + шлях + параметри запиту { #request-body-path-query-parameters }
 
 Ви також можете оголосити параметри **тіло**, **шлях** і **запит** одночасно.
 
 **FastAPI** розпізнає кожен з них і візьме дані з потрібного місця.
 
-{* ../../docs_src/body/tutorial004.py hl[18] *}
+{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
 
 Параметри функції будуть розпізнаватися наступним чином:
 
 * Якщо параметр також оголошено в **шляху**, він використовуватиметься як параметр шляху.
 * Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**.
-* Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** запиту.
+* Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**.
+
+/// note | Примітка
 
-/// note
+FastAPI буде знати, що значення `q` не є обов'язковим через значення за замовчуванням `= None`.
 
-FastAPI буде знати, що значення "q" не є обов'язковим через значення за замовчуванням "= None".
+`str | None` (Python 3.10+) або `Union` у `Union[str, None]` (Python 3.9+) FastAPI не використовує, щоб визначити, що значення не є обов’язковим — він знатиме, що воно не є обов’язковим, тому що має значення за замовчуванням `= None`.
 
-`Optional` у `Optional[str]` не використовується FastAPI, але дозволить вашому редактору надати вам кращу підтримку та виявляти помилки.
+Але додавання анотацій типів дозволить вашому редактору надати вам кращу підтримку та виявляти помилки.
 
 ///
 
-## Без Pydantic
+## Без Pydantic { #without-pydantic }
 
-Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло – Кілька параметрів: сингулярні значення в тілі](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
+Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
index f070b6ac83bc322f1e828f0b8f1993a81b419392..3c6407716ed198060ee43b2079f993633b3b0240 100644 (file)
@@ -1,32 +1,32 @@
-# Ð\9cоделÑ\96 Ð´Ð»Ñ\8f Cookie-паÑ\80амеÑ\82Ñ\80Ñ\96в
+# Ð\9cоделÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Cookie { #cookie-parameter-models }
 
-Якщо у Вас є група **cookies** параметрів, які пов'язані між собою, Ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
+Якщо у Вас є група **cookies**, які пов'язані між собою, Ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
 
 Це дозволить Вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
 
-/// note | Ð\9dоÑ\82аÑ\82ки
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
-Це підтримується з версії FastAPI  `0.115.0`. 🤓
+Це підтримується з версії FastAPI `0.115.0`. 🤓
 
 ///
 
 /// tip | Порада
 
-Ця ж техніка застосовується до `Query`, `Cookie`, та `Header`. 😎
+Ця ж техніка застосовується до `Query`, `Cookie` та `Header`. 😎
 
 ///
 
-## Cookie з Pydantic-моделлю
+## Cookie з Pydantic-моделлю { #cookies-with-a-pydantic-model }
 
-Оголосіть **cookie-параметри**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
+Оголосіть **cookie**-параметри, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
 
 {* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
 
-**FastAPI** буде **витягувати** дані для **кожного поля** з **cookie** параметрів, отриманих у запиті, і передавати Вам Pydantic-модель, яку Ви визначили.
+**FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати Вам Pydantic-модель, яку Ви визначили.
 
-## Перевірка у документації
+## Перевірка у документації { #check-the-docs }
 
-Ви можете побачити визначені cookie в інтерфейсі документації за адресою `/docs`:
+Ви можете побачити визначені cookies в інтерфейсі документації за адресою `/docs`:
 
 <div class="screenshot">
 <img src="/img/tutorial/cookie-param-models/image01.png">
 
 /// info | Інформація
 
-Майте на увазі, що оскільки **браузери обробляють cookie** особливим чином і "за лаштунками", вони **не** дозволяють **JavaScript** легко з ними працювати.
+Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
 
-Якщо Ви зайдете до **інтерфейсу документації API** за адресою `/docs`, Ви зможете побачити **документацію** для cookie у Ваших **операціях шляху**.
+Якщо Ви зайдете до **інтерфейсу документації API** за адресою `/docs`, Ви зможете побачити **документацію** для cookies у Ваших *операціях шляху*.
 
-Але навіть якщо Ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookie не будуть відправлені, і Ви побачите **помилку**, ніби Ви не ввели жодних значень.
+Але навіть якщо Ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і Ви побачите **помилку**, ніби Ви не ввели жодних значень.
 
 ///
 
-## Заборона додаткових cookie
+## Заборона додаткових cookie { #forbid-extra-cookies }
 
-У деяких спеціальних випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** список cookie, які хочете отримувати.
+У деяких спеціальних випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** cookies, які хочете отримувати.
 
-Ваша API тепер має можливість контролювати власну <abbr title="Це жарт, якщо що. Це не має нічого спільного зі згодою на використання cookie, але це кумедно, що навіть API тепер може відхиляти бідні cookie. Ловіть печиво. 🍪">згоду на cookie</abbr>. 🤪🍪
+Ваша API тепер має можливість контролювати власну <abbr title="This is a joke, just in case. It has nothing to do with cookie consents, but it's funny that even the API can now reject the poor cookies. Have a cookie. 🍪">згоду на cookie</abbr>. 🤪🍪
 
-Ви можете використовувати налаштування моделі Pydantic, щоб `заборонити` будь-які `додаткові` поля:
+Ви можете використовувати налаштування моделі Pydantic, щоб `forbid` будь-які `extra` поля:
 
-{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
+{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *}
 
-Якщо клієнт спробує надіслати якісь **додаткові cookie**, він отримає відповідь з **помилкою**.
+Якщо клієнт спробує надіслати якісь **додаткові cookies**, він отримає відповідь з **помилкою**.
 
-Бідні банери cookie, які так старанно намагаються отримати Вашу згоду, щоб <abbr title="Це ще один жарт. Не звертайте уваги. Візьміть каву для свого печива. ☕">API її відхилила</abbr>. 🍪
+Бідні банери cookie, які так старанно намагаються отримати Вашу згоду, щоб <abbr title="This is another joke. Don't pay attention to me. Have some coffee for your cookie. ☕">API її відхилила</abbr>. 🍪
 
-Наприклад, якщо клієнт спробує надіслати cookie `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з помилкою, яка повідомить, що <abbr title="Санта не схвалює відсутність cookie. 🎅 Гаразд, більше жартів не буде.">cookie `santa_tracker` не дозволено</abbr>:
+Наприклад, якщо клієнт спробує надіслати cookie `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з помилкою, яка повідомить, що `santa_tracker` <abbr title="Santa disapproves the lack of cookies. 🎅 Okay, no more cookie jokes.">cookie не дозволено</abbr>:
 
 ```json
 {
@@ -71,6 +71,6 @@
 }
 ```
 
-## Підсумок
+## Підсумок { #summary }
 
-Ви можете використовувати **Pydantic-моделі** для оголошення <abbr title="Отримайте останнє печиво перед тим, як піти. 🍪">cookie</abbr> у FastAPI. 😎
+Ви можете використовувати **Pydantic-моделі** для оголошення <abbr title="Have a last cookie before you go. 🍪">**cookies**</abbr> у **FastAPI**. 😎
index b320645cb3093708ac9e13b621c00ba41d7cefa8..8a5b44e8aab32ebaf33e7a1549052640fad1f52f 100644 (file)
@@ -1,24 +1,25 @@
-# Параметри Cookie
+# Параметри Cookie { #cookie-parameters }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87ити параметри Cookie таким же чином, як визначаються параметри `Query` і `Path`.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87ати параметри Cookie таким же чином, як визначаються параметри `Query` і `Path`.
 
-## Імпорт `Cookie`
+## Імпорт `Cookie` { #import-cookie }
 
 Спочатку імпортуйте `Cookie`:
 
 {* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[3] *}
 
-## Визначення параметрів `Cookie`
+## Визначення параметрів `Cookie` { #declare-cookie-parameters }
 
 Потім визначте параметри cookie, використовуючи таку ж конструкцію як для `Path` і `Query`.
 
\9fеÑ\80Ñ\88е Ð·Ð½Ð°Ñ\87еннÑ\8f Ñ\86е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\82акож Ð¿ÐµÑ\80едаÑ\82и Ð²сі додаткові параметри валідації чи анотації:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, Ð° Ñ\82акож Ñ\83сі додаткові параметри валідації чи анотації:
 
 {* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *}
 
-/// note | Технічні Деталі
+/// note | Технічні деталі
+
+`Cookie` це "сестра" класів `Path` і `Query`. Вони також наслідуються від одного спільного класу `Param`.
 
-`Cookie` це "сестра" класів `Path` і `Query`. Вони наслідуються від одного батьківського класу `Param`.
 Але пам'ятайте, що коли ви імпортуєте `Query`, `Path`, `Cookie` та інше з `fastapi`, це фактично функції, що повертають спеціальні класи.
 
 ///
 
 ///
 
-## Підсумки
+/// info
+
+Майте на увазі, що оскільки **браузери обробляють cookies** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними.
+
+Якщо ви перейдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies для ваших *операцій шляху*.
+
+Але навіть якщо ви **заповните дані** і натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не буде надіслано, і ви побачите повідомлення про **помилку**, ніби ви не ввели жодних значень.
+
+///
+
+## Підсумки { #recap }
 
 Визначайте cookies за допомогою `Cookie`, використовуючи той же спільний шаблон, що і `Query` та `Path`.
index 95b204d0f729722dab371d1905b9f9245157035a..f3ed8a7d942c2b1dfd2bdfadf5bb0a1bd696a3cb 100644 (file)
@@ -1,8 +1,8 @@
-# CORS (Обмін ресурсами між різними джерелами)
+# CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing }
 
-<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS або "Обмін ресурсами між різними джерелами"</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому "джерелі" (origin).
+<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS або "Cross-Origin Resource Sharing"</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому "джерелі" (origin).
 
-## Джерело (Origin)
+## Джерело (Origin) { #origin }
 
 Джерело визначається комбінацією протоколу (`http`, `https`), домену (`myapp.com`, `localhost`, `localhost.tiangolo.com`), порту (`80`, `443`, `8080`).
 
@@ -15,7 +15,7 @@
 
 Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими "джерелами".
 
-## Кроки
+## Кроки { #steps }
 
 Припустимо, що Ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost`  (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`).
 
 
 У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно.
 
-## Символьне підставляння
+## Символьне підставляння { #wildcards }
 
 Можна також оголосити список як `"*"` ("символьне підставляння"), що означає дозвіл для всіх джерел.
 
-Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer токенами тощо.
+Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer Tokens, тощо.
 
 Тому для коректної роботи краще явно вказувати дозволені джерела.
 
-## Використання `CORSMiddleware`
+## Використання `CORSMiddleware` { #use-corsmiddleware }
 
 Ви можете налаштувати це у Вашому додатку **FastAPI** за допомогою `CORSMiddleware`.
 
 
 Також можна вказати, чи дозволяє Ваш бекенд:
 
-* Облікові дані (заголовки авторизації, сookies, тощо).
+* Облікові дані (заголовки авторизації, Cookies, тощо).
 * Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
 * Конкретні HTTP-заголовки або всі за допомогою `"*"`.
 
 
-{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *}
+{* ../../docs_src/cors/tutorial001_py39.py hl[2,6:11,13:19] *}
 
-Параметри за замовчуванням у `CORSMiddleware` є досить обмеженими, тому Вам потрібно явно вказати конкретні джерела, методи або заголовки, щоб браузери могли використовувати їх у контексті запитів між різними доменами.
 
+Параметри за замовчуванням у реалізації `CORSMiddleware` є досить обмеженими, тому Вам потрібно явно увімкнути конкретні джерела, методи або заголовки, щоб браузерам було дозволено використовувати їх у міждоменному контексті.
 
 Підтримуються такі аргументи:
 
-* `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити.  Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати ['*'], щоб дозволити всі джерела.
+* `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити.  Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати `['*']`, щоб дозволити будь-яке джерело.
 * `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`.
 * `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи.
-* `allow_headers` - Список HTTP-заголовків, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простих CORS-запитів</a>.
-* `allow_credentials` - Визначає, чи підтримуються файли cookie для міждоменних запитів. За замовчуванням `False`. Також, якщо потрібно дозволити обмін обліковими даними (`allow_credentials = True`), параметр `allow_origins` не може бути встановлений як `['*']`, необхідно вказати конкретні джерела.
+* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простих CORS-запитів</a>.
+* `allow_credentials` - Визначає, чи повинні підтримуватися cookies для міждоменних запитів. За замовчуванням `False`.
+
+    Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">явно вказані</a>.
+
 * `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
 * `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
 
 Цей middleware обробляє два типи HTTP-запитів...
 
-### Попередні CORS-запити (preflight requests)
+### Попередні CORS-запити { #cors-preflight-requests }
 
 Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`.
 
 У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей.
 
-### Прості запити
+### Прості запити { #simple-requests }
 
 Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь.
 
-## Додаткова інформація
+## Додаткова інформація { #more-info }
 
-Більше про <abbr title="Cross-Origin Resource Sharing">CORS</abbr> можна дізнатися в <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">документації Mozilla</a>.
+Більше про <abbr title="Cross-Origin Resource Sharing">CORS</abbr> можна дізнатися в <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">документації Mozilla про CORS</a>.
 
 /// note | Технічні деталі
 
index b0e5344f819ecdf15380fcd9b774d8cdcc2e230a..0db418dcc9a9fa3a2e06a1bef01019c480952a50 100644 (file)
@@ -1,16 +1,16 @@
-# Налагодження (Debugging)
+# Налагодження { #debugging }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\96д'Ñ\94днаÑ\82и Ð´ÐµÐ±Ð°Ð³ÐµÑ\80 Ñ\83 Ð\92ашому редакторі коду, наприклад, у Visual Studio Code або PyCharm.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\96д'Ñ\94днаÑ\82и Ð´ÐµÐ±Ð°Ð³ÐµÑ\80 Ñ\83 Ð²ашому редакторі коду, наприклад, у Visual Studio Code або PyCharm.
 
-## Виклик `uvicorn`
+## Виклик `uvicorn` { #call-uvicorn }
 
-У Ð\92ашому FastAPI-додатку імпортуйте та запустіть `uvicorn` безпосередньо:
+У Ð²ашому FastAPI-додатку імпортуйте та запустіть `uvicorn` безпосередньо:
 
-{* ../../docs_src/debugging/tutorial001.py hl[1,15] *}
+{* ../../docs_src/debugging/tutorial001_py39.py hl[1,15] *}
 
-### Про `__name__ == "__main__"`
+### Про `__name__ == "__main__"` { #about-name-main }
 
-Головна мета використання `__name__ == "__main__"` — це забезпечення виконання певного коду тільки тоді, коли файл запускається безпосередньо:
+Головна мета використання `__name__ == "__main__"` — це забезпечення виконання певного коду лише тоді, коли ваш файл запускається так:
 
 <div class="termy">
 
@@ -20,17 +20,17 @@ $ python myapp.py
 
 </div>
 
-але не виконується при його імпорті в інший файл, наприклад:
+але не виконується, коли інший файл імпортує його, наприклад:
 
 ```Python
 from myapp import app
 ```
 
-#### Детальніше
+#### Детальніше { #more-details }
 
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ð\92аш файл називається `myapp.py`.
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ð²аш файл називається `myapp.py`.
 
-ЯкÑ\89о Ð\92и запустите його так:
+ЯкÑ\89о Ð²и запустите його так:
 
 <div class="termy">
 
@@ -40,7 +40,7 @@ $ python myapp.py
 
 </div>
 
-тоді внутрішня змінна `__name__`, яка створюється автоматично Python, матиме значення `"__main__"`.
+тоді внутрішня змінна `__name__` у вашому файлі, яка створюється автоматично Python, матиме значення рядка `"__main__"`.
 
 Отже, цей блок коду:
 
@@ -52,17 +52,17 @@ $ python myapp.py
 
 ---
 
-Це Ð½Ðµ Ñ\81Ñ\82анеÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\8fкÑ\89о Ð\92и імпортуєте цей модуль (файл).
+Це Ð½Ðµ Ñ\81Ñ\82анеÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\8fкÑ\89о Ð²и імпортуєте цей модуль (файл).
 
¯ÐºÑ\89о Ñ\83 Ð\92аÑ\81 Ñ\94 Ñ\96нÑ\88ий Ñ\84айл, Ð½Ð°Ð¿Ñ\80иклад `importer.py`, Ð· Ð½Ð°Ñ\81Ñ\82Ñ\83пним ÐºÐ¾Ð´Ð¾Ð¼:
\9eÑ\82же, Ñ\8fкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ñ\96нÑ\88ий Ñ\84айл `importer.py` Ð·:
 
 ```Python
 from myapp import app
 
-# Додатковий код
+# Some more code
 ```
 
-У цьому випадку автоматично створена змінна у файлі `myapp.py` не матиме значення змінної `__name__` як `"__main__"`.
+у цьому випадку автоматично створена змінна `__name__` всередині `myapp.py` не матиме значення `"__main__"`.
 
 Отже, рядок:
 
@@ -74,38 +74,39 @@ from myapp import app
 
 /// info | Інформація
 
\91Ñ\96лÑ\8cÑ\88 Ð´ÐµÑ\82алÑ\8cнÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð² <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">оÑ\84Ñ\96Ñ\86Ñ\96йнÑ\96й Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 Python</a>.
\94лÑ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ð´Ð¾Ð´Ð°Ñ\82ковоÑ\97 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\97 Ð´Ð¸Ð²Ñ\96Ñ\82Ñ\8cÑ\81Ñ\8f <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">оÑ\84Ñ\96Ñ\86Ñ\96йнÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e Python</a>.
 
 ///
 
-## Запуск коду з вашим дебагером
+## Запуск коду з вашим дебагером { #run-your-code-with-your-debugger }
 
\9eÑ\81кÑ\96лÑ\8cки Ð\92и Ð·Ð°Ð¿Ñ\83Ñ\81каÑ\94Ñ\82е Ñ\81еÑ\80веÑ\80 Uvicorn Ð±ÐµÐ·Ð¿Ð¾Ñ\81еÑ\80еднÑ\8cо Ð· Ð\92аÑ\88ого ÐºÐ¾Ð´Ñ\83, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и Ð²Ð°Ñ\88Ñ\83 Python Ð¿Ñ\80огÑ\80амÑ\83 (ваÑ\88 FastAPI додаток) безпосередньо з дебагера.
\9eÑ\81кÑ\96лÑ\8cки Ð²Ð¸ Ð·Ð°Ð¿Ñ\83Ñ\81каÑ\94Ñ\82е Ñ\81еÑ\80веÑ\80 Uvicorn Ð±ÐµÐ·Ð¿Ð¾Ñ\81еÑ\80еднÑ\8cо Ð· Ð²Ð°Ñ\88ого ÐºÐ¾Ð´Ñ\83, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и Ð²Ð°Ñ\88Ñ\83 Python Ð¿Ñ\80огÑ\80амÑ\83 (ваÑ\88 FastAPI-додаток) безпосередньо з дебагера.
 
 ---
 
\9dапÑ\80иклад, Ñ\83 Visual Studio Code Ð\92и можете:
\9dапÑ\80иклад, Ñ\83 Visual Studio Code Ð²и можете:
 
-* Ð\9fеÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° Ð²ÐºÐ»Ð°Ð´ÐºÑ\83 "Debug".
-* Натисніть "Add configuration...".
-* Виберіть "Python"
+* Ð\9fеÑ\80ейдÑ\96Ñ\82Ñ\8c Ð½Ð° Ð¿Ð°Ð½ÐµÐ»Ñ\8c Â«Debug».
+* «Add configuration...».
+* Виберіть «Python»
 * Запустіть дебагер з опцією "`Python: Current File (Integrated Terminal)`".
 
¦Ðµ Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81еÑ\80веÑ\80 Ð· Ð\92аÑ\88им **FastAPI** ÐºÐ¾Ð´Ð¾Ð¼, зупиниться на точках зупину тощо.
\9fÑ\96Ñ\81лÑ\8f Ñ\86Ñ\8cого Ð²Ñ\96н Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81еÑ\80веÑ\80 Ð· Ð²Ð°Ñ\88им ÐºÐ¾Ð´Ð¾Ð¼ **FastAPI**, зупиниться на точках зупину тощо.
 
 Ось як це може виглядати:
 
 <img src="/img/tutorial/debugging/image01.png">
 
 ---
-Якщо Ви використовуєте PyCharm, ви можете:
 
-* Відкрити меню "Run".
-* Вибрати опцію "Debug...".
+Якщо ви використовуєте PyCharm, ви можете:
+
+* Відкрити меню «Run».
+* Вибрати опцію «Debug...».
 * Потім з'явиться контекстне меню.
 * Вибрати файл для налагодження (у цьому випадку, `main.py`).
 
¦Ðµ Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81еÑ\80веÑ\80 Ð· Ð\92аÑ\88им **FastAPI** ÐºÐ¾Ð´Ð¾Ð¼, зупиниться на точках зупину тощо.
\9fÑ\96Ñ\81лÑ\8f Ñ\86Ñ\8cого Ð²Ñ\96н Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81еÑ\80веÑ\80 Ð· Ð²Ð°Ñ\88им ÐºÐ¾Ð´Ð¾Ð¼ **FastAPI**, зупиниться на точках зупину тощо.
 
 Ось як це може виглядати:
 
index f202c7989ed1bf3f1dbc9b40d1c5f33ae06a6433..1b403d5bba0d9d50484f99e04502adc05ec9e740 100644 (file)
@@ -1,32 +1,32 @@
-# JSON Compatible Encoder
+# JSON-сумісний кодувальник { #json-compatible-encoder }
 
\86Ñ\81нÑ\83Ñ\8eÑ\82Ñ\8c Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð²Ð°Ð¼ Ð¼Ð¾Ð¶Ðµ Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82иÑ\81Ñ\8f Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и Ñ\82ип Ð´Ð°Ð½Ð¸Ñ\85 (напÑ\80иклад, Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic) Ð² Ñ\89оÑ\81Ñ\8c Ñ\81Ñ\83мÑ\96Ñ\81не Ð· JSON (напÑ\80иклад, `dict`, `list`, Ñ\96 Ñ\82. Ð´.).
\86Ñ\81нÑ\83Ñ\8eÑ\82Ñ\8c Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð²Ð°Ð¼ Ð¼Ð¾Ð¶Ðµ Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82иÑ\81Ñ\8f Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и Ñ\82ип Ð´Ð°Ð½Ð¸Ñ\85 (напÑ\80иклад, Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic) Ð½Ð° Ñ\89оÑ\81Ñ\8c Ñ\81Ñ\83мÑ\96Ñ\81не Ð· JSON (напÑ\80иклад, `dict`, `list` Ñ\82оÑ\89о).
 
 Наприклад, якщо вам потрібно зберегти це в базі даних.
 
-Для цього, **FastAPI** надає `jsonable_encoder()` функцію.
+Для цього **FastAPI** надає функцію `jsonable_encoder()`.
 
-## Використання `jsonable_encoder`
+## Використання `jsonable_encoder` { #using-the-jsonable-encoder }
 
 Давайте уявимо, що у вас є база даних `fake_db`, яка приймає лише дані, сумісні з JSON.
 
 Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON.
 
\9eÑ\82же, Ð¾Ð±'Ñ\94кÑ\82 Ñ\82ипÑ\83 `datetime` Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и Ð² Ñ\80Ñ\8fдок `str`, Ñ\8fкий Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´Ð°Ð½Ñ\96 Ð² <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">ISO Ñ\84оÑ\80маÑ\82Ñ\96</a>.
\9eÑ\82же, Ð¾Ð±'Ñ\94кÑ\82 Ñ\82ипÑ\83 `datetime` Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80еÑ\82воÑ\80иÑ\82и Ð½Ð° `str`, Ñ\8fкий Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´Ð°Ð½Ñ\96 Ð² <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">Ñ\84оÑ\80маÑ\82Ñ\96 ISO</a>.
 
-Тим Ñ\81амим Ñ\81поÑ\81обом Ñ\86Ñ\8f Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð¸Ñ\85 Ð½Ðµ Ð¿Ñ\80иймаÑ\82име Ð¾Ð±'Ñ\94кÑ\82 Ñ\82ипÑ\83 Pydantic model (об'єкт з атрибутами), а лише `dict`.
+Так Ñ\81амо Ñ\86Ñ\8f Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð¸Ñ\85 Ð½Ðµ Ð¿Ñ\80иймаÑ\82име Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic (об'єкт з атрибутами), а лише `dict`.
 
 Ви можете використовувати `jsonable_encoder` для цього.
 
-Вона приймає об'єкт, такий як Pydantic model, і повертає його версію, сумісну з JSON:
+Вона приймає об'єкт, такий як модель Pydantic, і повертає його версію, сумісну з JSON:
 
 {* ../../docs_src/encoder/tutorial001_py310.py hl[4,21] *}
 
-У цьому прикладі вона конвертує Pydantic model у `dict`, а `datetime` у `str`.
+У цьому прикладі вона конвертує модель Pydantic у `dict`, а `datetime` у `str`.
 
-Результат виклику цієї функції - це щось, що можна кодувати з використанням стандарту Python <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>.
+Результат виклику цієї функції  це щось, що можна кодувати з використанням стандарту Python <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>.
 
-Вона не повертає велику строку `str`, яка містить дані у форматі JSON (як строка). Вона повертає стандартну структуру даних Python (наприклад `dict`) із значеннями та підзначеннями, які є сумісними з JSON.
+Вона не повертає великий `str`, який містить дані у форматі JSON (як рядок). Вона повертає стандартну структуру даних Python (наприклад, `dict`) зі значеннями та підзначеннями, які є сумісними з JSON.
 
 /// note | Примітка
 
index 5da942b6e0c587ab3b823f9f52800701511c4591..a3545e0746ed480df5677ffd9993357d6845918b 100644 (file)
@@ -1,13 +1,13 @@
-# Додаткові типи даних
+# Додаткові типи даних { #extra-data-types }
 
-До цього часу, ви використовували загальнопоширені типи даних, такі як:
+До цього часу ви використовували загальнопоширені типи даних, такі як:
 
 * `int`
 * `float`
 * `str`
 * `bool`
 
\90ле Ð¼Ð¾Ð¶Ð½Ð° Ñ\82акож використовувати більш складні типи даних.
\90ле Ð²Ð¸ Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е використовувати більш складні типи даних.
 
 І ви все ще матимете ті ж можливості, які були показані до цього:
 
 * Валідація даних.
 * Автоматична анотація та документація.
 
-## Інші типи даних
+## Інші типи даних { #other-data-types }
 
 Ось додаткові типи даних для використання:
 
 * `UUID`:
-    * Стандартний "Універсальний Унікальний Ідентифікатор", який часто використовується як ідентифікатор у багатьох базах даних та системах.
+    * Стандартний "Універсальний унікальний ідентифікатор", який часто використовується як ID у багатьох базах даних та системах.
     * У запитах та відповідях буде представлений як `str`.
 * `datetime.datetime`:
     * Пайтонівський `datetime.datetime`.
-    * У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `2008-09-15T15:53:00+05:00`.
+    * У запитах та відповідях буде представлений як `str` у форматі ISO 8601, як: `2008-09-15T15:53:00+05:00`.
 * `datetime.date`:
     * Пайтонівський `datetime.date`.
-    * У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `2008-09-15`.
+    * У запитах та відповідях буде представлений як `str` у форматі ISO 8601, як: `2008-09-15`.
 * `datetime.time`:
     * Пайтонівський `datetime.time`.
-    * У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `14:23:55.003`.
+    * У запитах та відповідях буде представлений як `str` у форматі ISO 8601, як: `14:23:55.003`.
 * `datetime.timedelta`:
     * Пайтонівський `datetime.timedelta`.
     * У запитах та відповідях буде представлений як `float` загальної кількості секунд.
-    * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", <a href="https://docs.pydantic.dev/latest/concepts/serialization/#json_encoders" class="external-link" target="_blank">більше інформації дивись у документації</a>.
+    * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", <a href="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers" class="external-link" target="_blank">дивіться документацію для отримання додаткової інформації</a>.
 * `frozenset`:
     * У запитах і відповідях це буде оброблено так само, як і `set`:
-        * У запитах список буде зчитано, дублікати будуть видалені та він буде перетворений на `set`.
-        * У відповідях, `set` буде перетворений на `list`.
+        * У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`.
+        * У відповідях `set` буде перетворено на `list`.
         * Згенерована схема буде вказувати, що значення `set` є унікальними (з використанням JSON Schema's `uniqueItems`).
 * `bytes`:
     * Стандартний Пайтонівський `bytes`.
 * `Decimal`:
     * Стандартний Пайтонівський `Decimal`.
     * У запитах і відповідях це буде оброблено так само, як і `float`.
-* Ви можете перевірити всі дійсні типи даних Pydantic тут: <a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">типи даних Pydantic</a>.
+* Ви можете перевірити всі дійсні типи даних Pydantic тут: <a href="https://docs.pydantic.dev/latest/usage/types/types/" class="external-link" target="_blank">типи даних Pydantic</a>.
 
-## Приклад
+## Приклад { #example }
 
-Ось приклад *path operation* з параметрами, використовуючи деякі з вищезазначених типів.
+Ось приклад *операції шляху* з параметрами, використовуючи деякі з вищезазначених типів.
 
 {* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *}
 
index 3f861cb484d2109916fff33fe32fa1c1b657849a..5f3750010c37dd40376df0ea202aaf2e2d84ed60 100644 (file)
-# Перші кроки
+# Перші кроки { #first-steps }
 
 Найпростіший файл FastAPI може виглядати так:
 
-{* ../../docs_src/first_steps/tutorial001.py *}
+{* ../../docs_src/first_steps/tutorial001_py39.py *}
 
 Скопіюйте це до файлу `main.py`.
 
-Запустіть сервер:
+Запустіть live-сервер:
 
 <div class="termy">
 
 ```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:single">main.py</u>
-<font color="#3465A4">INFO    </font> Using path <font color="#3465A4">main.py</font>
-<font color="#3465A4">INFO    </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
-<font color="#3465A4">INFO    </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
-<font color="#3465A4">INFO    </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
-
- ╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮
- │                      │
- │  🐍 main.py          │
- │                      │
- ╰──────────────────────╯
-
-<font color="#3465A4">INFO    </font> Importing module <font color="#4E9A06">main</font>
-<font color="#3465A4">INFO    </font> Found importable FastAPI app
-
- ╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮
- │                          │
- │  <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822">  </span>  │
- │                          │
- ╰──────────────────────────╯
-
-<font color="#3465A4">INFO    </font> Using import string <font color="#8AE234"><b>main:app</b></font>
-
- <span style="background-color:#C4A000"><font color="#2E3436">╭────────── FastAPI CLI - Development mode ───────────╮</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│  Serving at: http://127.0.0.1:8000                  │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│  API docs: http://127.0.0.1:8000/docs               │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│  Running in development mode, for production use:   │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│  </font></span><span style="background-color:#C4A000"><font color="#555753"><b>fastapi run</b></font></span><span style="background-color:#C4A000"><font color="#2E3436">                                        │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">│                                                     │</font></span>
- <span style="background-color:#C4A000"><font color="#2E3436">╰─────────────────────────────────────────────────────╯</font></span>
-
-<font color="#4E9A06">INFO</font>:     Will watch for changes in these directories: [&apos;/home/user/code/awesomeapp&apos;]
-<font color="#4E9A06">INFO</font>:     Uvicorn running on <b>http://127.0.0.1:8000</b> (Press CTRL+C to quit)
-<font color="#4E9A06">INFO</font>:     Started reloader process [<font color="#34E2E2"><b>2265862</b></font>] using <font color="#34E2E2"><b>WatchFiles</b></font>
-<font color="#4E9A06">INFO</font>:     Started server process [<font color="#06989A">2265873</font>]
-<font color="#4E9A06">INFO</font>:     Waiting for application startup.
-<font color="#4E9A06">INFO</font>:     Application startup complete.
+$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+
+  <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting development server 🚀
+
+             Searching for package file structure from directories
+             with <font color="#3465A4">__init__.py</font> files
+             Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
+
+   <span style="background-color:#007166"><font color="#D3D7CF"> module </font></span>  🐍 main.py
+
+     <span style="background-color:#007166"><font color="#D3D7CF"> code </font></span>  Importing the FastAPI app object from the module with
+             the following code:
+
+             <u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
+
+      <span style="background-color:#007166"><font color="#D3D7CF"> app </font></span>  Using import string: <font color="#3465A4">main:app</font>
+
+   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
+   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
+
+      <span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span>  Running in development mode, for production use:
+             <b>fastapi run</b>
+
+             Logs:
+
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Will watch for changes in these directories:
+             <b>[</b><font color="#4E9A06">&apos;/home/user/code/awesomeapp&apos;</font><b>]</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C
+             to quit<b>)</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Waiting for application startup.
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Application startup complete.
 ```
 
 </div>
 
-У ÐºÐ¾Ð½Ñ\81олÑ\96 Ð±Ñ\83де рядок приблизно такого змісту:
+У Ð²Ð¸Ð²Ð¾Ð´Ñ\96 Ñ\94 рядок приблизно такого змісту:
 
 ```hl_lines="4"
 INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
 ```
 
-Цей Ñ\80Ñ\8fдок Ð¿Ð¾ÐºÐ°Ð·Ñ\83Ñ\94 URL, Ð·Ð° Ñ\8fким Ð´Ð¾Ð´Ð°Ñ\82ок Ð·Ð°Ð¿Ñ\83Ñ\81кається на вашій локальній машині.
+Цей Ñ\80Ñ\8fдок Ð¿Ð¾ÐºÐ°Ð·Ñ\83Ñ\94 URL, Ð·Ð° Ñ\8fким Ð²Ð°Ñ\88 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нок Ð¾Ð±Ñ\81лÑ\83говÑ\83ється на вашій локальній машині.
 
-### Перевірте
+### Перевірте { #check-it }
 
 Відкрийте браузер та введіть адресу <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>.
 
-Ви побачите у відповідь таке повідомлення у форматі JSON:
+Ви побачите JSON-відповідь:
 
 ```JSON
 {"message": "Hello World"}
 ```
 
-### Інтерактивна API документація
+### Інтерактивна API документація { #interactive-api-docs }
 
\9fеÑ\80ейдемо сюди <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
¢ÐµÐ¿ÐµÑ\80 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c сюди <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
 
-Ви побачите автоматичну інтерактивну API документацію (створену завдяки <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
+Ви побачите автоматичну інтерактивну API документацію (надається <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
 
 ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
 
-### Альтернативна API документація
+### Альтернативна API документація { #alternative-api-docs }
 
¢ÐµÐ¿ÐµÑ\80 Ð¿ÐµÑ\80ейдемо сюди <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
\90 Ñ\82епеÑ\80 Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c сюди <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
 
-Ви побачите альтернативну автоматичну документацію (створену завдяки <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
+Ви побачите альтернативну автоматичну документацію (надається <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
-### OpenAPI
+### OpenAPI { #openapi }
 
-**FastAPI** генерує "схему" з усім вашим API, використовуючи стандарт **OpenAPI** для визначення API.
+**FastAPI** генерує «схему» з усім вашим API, використовуючи стандарт **OpenAPI** для визначення API.
 
-#### "Схема"
+#### «Схема» { #schema }
 
-"Схема" - це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис.
+«Схема» — це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис.
 
-#### API "схема"
+#### API «схема» { #api-schema }
 
 У цьому випадку, <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> є специфікацією, яка визначає, як описати схему вашого API.
 
-Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають тощо.
+Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо.
 
-#### "Схема" даних
+#### «Схема» даних { #data-schema }
 
-Термін "схема" також може відноситися до структури даних, наприклад, JSON.
+Термін «схема» також може відноситися до форми деяких даних, наприклад, вмісту JSON.
 
-У цьому випадку це означає - атрибути JSON і типи даних, які вони мають тощо.
+У цьому випадку це означає атрибути JSON і типи даних, які вони мають, тощо.
 
-#### OpenAPI і JSON Schema
+#### OpenAPI і JSON Schema { #openapi-and-json-schema }
 
-OpenAPI описує схему для вашого API. І ця схема включає визначення (або "схеми") даних, що надсилаються та отримуються вашим API за допомогою **JSON Schema**, стандарту для схем даних JSON.
+OpenAPI описує схему API для вашого API. І ця схема включає визначення (або «схеми») даних, що надсилаються та отримуються вашим API, за допомогою **JSON Schema**, стандарту для схем даних JSON.
 
-#### Ð Ð¾Ð·Ð³Ð»Ñ\8fнемо `openapi.json`
+#### Ð\9fеÑ\80евÑ\96Ñ\80Ñ\82е `openapi.json` { #check-the-openapi-json }
 
-Якщо вас цікавить, як виглядає вихідна схема OpenAPI, то FastAPI автоматично генерує JSON-схему з усіма описами API.
+Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API.
 
\9eзнайомиÑ\82иÑ\81Ñ\8f Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и Ñ\86е Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83 Ñ\82Ñ\83Ñ\82: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>.
 
-Ви побачите приблизно такий JSON:
+Ви побачите JSON, що починається приблизно так:
 
 ```JSON
 {
@@ -143,42 +135,79 @@ OpenAPI описує схему для вашого API. І ця схема вк
 ...
 ```
 
-#### Для чого потрібний OpenAPI
+#### Для чого потрібний OpenAPI { #what-is-openapi-for }
+
+OpenAPI schema — це те, на чому працюють дві включені системи інтерактивної документації.
+
+Також існують десятки альтернатив, і всі вони засновані на OpenAPI. Ви можете легко додати будь-яку з цих альтернатив до вашого застосунку, створеного з **FastAPI**.
 
¡Ñ\85ема OpenAPI Ñ\94 Ð¾Ñ\81новоÑ\8e Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ñ\85 Ñ\81иÑ\81Ñ\82ем Ñ\96нÑ\82еÑ\80акÑ\82ивноÑ\97 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97.
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¹Ð¾Ð³Ð¾ Ð´Ð»Ñ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87ноÑ\97 Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\97 ÐºÐ¾Ð´Ñ\83 Ð´Ð»Ñ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\96в, Ñ\8fкÑ\96 Ð²Ð·Ð°Ñ\94модÑ\96Ñ\8eÑ\82Ñ\8c Ð· Ð²Ð°Ñ\88им API. Ð\9dапÑ\80иклад, Ð´Ð»Ñ\8f Ñ\84Ñ\80онÑ\82енд-, Ð¼Ð¾Ð±Ñ\96лÑ\8cниÑ\85 Ð°Ð±Ð¾ IoT-заÑ\81Ñ\82оÑ\81Ñ\83нкÑ\96в.
 
-Існують десятки альтернативних інструментів, заснованих на OpenAPI. Ви можете легко додати будь-який з них до **FastAPI** додатку.
+### Розгорніть ваш застосунок (необовʼязково) { #deploy-your-app-optional }
 
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и OpenAPI Ð´Ð»Ñ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87ноÑ\97 Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\97 ÐºÐ¾Ð´Ñ\83 Ð´Ð»Ñ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\96в, Ñ\8fкÑ\96 Ð²Ð·Ð°Ñ\94модÑ\96Ñ\8eÑ\82Ñ\8c Ð· API. Ð\9dапÑ\80иклад, Ð´Ð»Ñ\8f Ñ\84Ñ\80онÑ\82енд-, Ð¼Ð¾Ð±Ñ\96лÑ\8cниÑ\85 Ð°Ð±Ð¾ IoT-додаÑ\82кÑ\96в
\97а Ð±Ð°Ð¶Ð°Ð½Ð½Ñ\8fм Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80озгоÑ\80нÑ\83Ñ\82и Ð²Ð°Ñ\88 FastAPI-заÑ\81Ñ\82оÑ\81Ñ\83нок Ñ\83 <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>, Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ñ\96 Ð¿Ñ\80иÑ\94днайÑ\82еÑ\81Ñ\8f Ð´Ð¾ Ñ\81пиÑ\81кÑ\83 Ð¾Ñ\87Ñ\96кÑ\83ваннÑ\8f, Ñ\8fкÑ\89о Ð²Ð¸ Ñ\86Ñ\8cого Ñ\89е Ð½Ðµ Ð·Ñ\80обили. ð\9f\9a\80
 
-## А тепер крок за кроком
+Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
 
-### Крок 1: імпортуємо `FastAPI`
+Перед розгортанням переконайтеся, що ви увійшли:
 
-{* ../../docs_src/first_steps/tutorial001.py hl[1] *}
+<div class="termy">
+
+```console
+$ fastapi login
+
+You are logged in to FastAPI Cloud 🚀
+```
+
+</div>
+
+Потім розгорніть ваш застосунок:
+
+<div class="termy">
+
+```console
+$ fastapi deploy
 
-`FastAPI` це клас у Python, який надає всю функціональність для API.
+Deploying to FastAPI Cloud...
+
+✅ Deployment successful!
+
+🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
+```
+
+</div>
+
+Ось і все! Тепер ви можете отримати доступ до вашого застосунку за цим URL. ✨
+
+## Підібʼємо підсумки, крок за кроком { #recap-step-by-step }
+
+### Крок 1: імпортуємо `FastAPI` { #step-1-import-fastapi }
+
+{* ../../docs_src/first_steps/tutorial001_py39.py hl[1] *}
+
+`FastAPI` — це клас у Python, який надає всю функціональність для вашого API.
 
 /// note | Технічні деталі
 
-`FastAPI` це клас, який успадковується безпосередньо від `Starlette`.
+`FastAPI` — це клас, який успадковується безпосередньо від `Starlette`.
 
 Ви також можете використовувати всю функціональність <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> у `FastAPI`.
 
 ///
 
-### Крок 2: створюємо екземпляр `FastAPI`
+### Крок 2: створюємо «екземпляр» `FastAPI` { #step-2-create-a-fastapi-instance }
+
+{* ../../docs_src/first_steps/tutorial001_py39.py hl[3] *}
 
-{* ../../docs_src/first_steps/tutorial001.py hl[3] *}
-Змінна `app` є екземпляром класу `FastAPI`.
+Тут змінна `app` буде «екземпляром» класу `FastAPI`.
 
-Це Ð±Ñ\83де Ð³Ð¾Ð»Ð¾Ð²Ð½Ð° Ñ\82оÑ\87ка Ð´Ð»Ñ\8f Ñ\81Ñ\82воÑ\80еннÑ\8f Ñ\96 Ð²Ð·Ð°Ñ\94модÑ\96Ñ\97 Ð· API.
+Це Ð±Ñ\83де Ð³Ð¾Ð»Ð¾Ð²Ð½Ð° Ñ\82оÑ\87ка Ð²Ð·Ð°Ñ\94модÑ\96Ñ\97 Ð´Ð»Ñ\8f Ñ\81Ñ\82воÑ\80еннÑ\8f Ð²Ñ\81Ñ\8cого Ð²Ð°Ñ\88ого API.
 
-### Крок 3: визначте операцію шляху (path operation)
+### Крок 3: створіть *операцію шляху* { #step-3-create-a-path-operation }
 
-#### Шлях (path)
+#### Шлях { #path }
 
-"Шлях" це частина URL, яка йде одразу після символу `/`.
+«Шлях» тут означає останню частину URL, починаючи з першого `/`.
 
 Отже, у такому URL, як:
 
@@ -192,16 +221,17 @@ https://example.com/items/foo
 /items/foo
 ```
 
-/// info | Ð\94одаÑ\82кова Ñ\96нформація
+/// info | Ð\86нформація
 
-"Шлях" (path) також зазвичай називають "ендпоінтом" (endpoint) або "маршрутом" (route).
+«Шлях» також зазвичай називають «ендпоінтом» або «маршрутом».
 
 ///
 
-При створенні API, "шлях" є основним способом розділення "завдань" і "ресурсів".
-#### Operation
+Під час створення API «шлях» є основним способом розділити «завдання» і «ресурси».
+
+#### Операція { #operation }
 
-"Операція" (operation) тут означає один з "методів" HTTP.
+«Операція» тут означає один з HTTP «методів».
 
 Один з:
 
@@ -217,46 +247,47 @@ https://example.com/items/foo
 * `PATCH`
 * `TRACE`
 
-У HTTP-протоколі можна спілкуватися з кожним шляхом, використовуючи один (або кілька) з цих "методів".
+У протоколі HTTP ви можете спілкуватися з кожним шляхом, використовуючи один (або кілька) з цих «методів».
 
 ---
 
\9fÑ\80и Ñ\81Ñ\82воÑ\80еннÑ\96 API Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f ÐºÐ¾Ð½ÐºÑ\80еÑ\82нÑ\96 Ð¼ÐµÑ\82оди HTTP Ð´Ð»Ñ\8f Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\8f Ð¿ÐµÐ²Ð½Ð¸Ñ\85 Ð´Ñ\96й.
\9fÑ\96д Ñ\87аÑ\81 Ñ\81Ñ\82воÑ\80еннÑ\8f API Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\82Ñ\8c Ñ\86Ñ\96 ÐºÐ¾Ð½ÐºÑ\80еÑ\82нÑ\96 HTTP Ð¼ÐµÑ\82оди, Ñ\89об Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð¿ÐµÐ²Ð½Ñ\83 Ð´Ñ\96Ñ\8e.
 
¯Ðº Ð¿Ñ\80авило, використовують:
\97азвиÑ\87ай використовують:
 
-* `POST`: для створення даних.
-* `GET`: для читання даних.
-* `PUT`: для оновлення даних.
-* `DELETE`: для видалення даних.
+* `POST`: щоб створити дані.
+* `GET`: щоб читати дані.
+* `PUT`: щоб оновити дані.
+* `DELETE`: щоб видалити дані.
 
\92 OpenAPI ÐºÐ¾Ð¶ÐµÐ½ HTTP Ð¼ÐµÑ\82од Ð½Ð°Ð·Ð¸Ð²Ð°Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f "опеÑ\80аÑ\86Ñ\96Ñ\8f".
\9eÑ\82же, Ð² OpenAPI ÐºÐ¾Ð¶ÐµÐ½ Ð· HTTP Ð¼ÐµÑ\82одÑ\96в Ð½Ð°Ð·Ð¸Ð²Ð°Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Â«Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\94Ñ\8e».
 
\9cи Ñ\82акож Ð±Ñ\83демо Ð´Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82иÑ\81Ñ\8f Ñ\86Ñ\8cого Ñ\82еÑ\80мÑ\96на.
\9cи Ñ\82акож Ð±Ñ\83демо Ð½Ð°Ð·Ð¸Ð²Ð°Ñ\82и Ñ\97Ñ\85 Â«**опеÑ\80аÑ\86Ñ\96Ñ\8fми**».
 
-#### Визначте декоратор операції шляху (path operation decorator)
+#### Визначте *декоратор операції шляху* { #define-a-path-operation-decorator }
 
-{* ../../docs_src/first_steps/tutorial001.py hl[6] *}
-Декоратор `@app.get("/")` вказує **FastAPI**, що функція нижче, відповідає за обробку запитів, які надходять до неї:
+{* ../../docs_src/first_steps/tutorial001_py39.py hl[6] *}
 
-* шлях `/`
+Декоратор `@app.get("/")` повідомляє **FastAPI**, що функція одразу нижче відповідає за обробку запитів, які надходять до:
+
+* шляху `/`
 * використовуючи <abbr title="an HTTP GET method"><code>get</code> операцію</abbr>
 
-/// info | `@decorator` Ð\94одаÑ\82кова Ñ\96нформація
+/// info | `@decorator` Ð\86нформація
 
-Синтаксис `@something` у Python називається "декоратором".
+Синтаксис `@something` у Python називається «декоратором».
 
 Ви розташовуєте його над функцією. Як гарний декоративний капелюх (мабуть, звідти походить термін).
 
-"Декоратор" приймає функцію нижче і виконує з нею якусь дію.
+«Декоратор» бере функцію нижче і виконує з нею якусь дію.
 
 У нашому випадку, цей декоратор повідомляє **FastAPI**, що функція нижче відповідає **шляху** `/` і **операції** `get`.
 
-Це і є "декоратор операції шляху (path operation decorator)".
+Це і є «**декоратор операції шляху**».
 
 ///
 
-Можна також використовувати операції:
+Можна також використовувати інші операції:
 
 * `@app.post()`
 * `@app.put()`
@@ -271,58 +302,79 @@ https://example.com/items/foo
 
 /// tip | Порада
 
-Ви можете використовувати кожну операцію (HTTP-метод) на свій розсуд.
+Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте.
 
-**FastAPI** не нав'язує жодного певного значення для кожного методу.
+**FastAPI** не навʼязує жодного конкретного значення.
 
-Наведена тут інформація є рекомендацією, а не обов'язковою вимогою.
+Наведена тут інформація подана як настанова, а не вимога.
 
\9dапÑ\80иклад, Ð¿Ñ\96д Ñ\87аÑ\81 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f GraphQL Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ñ\83Ñ\81Ñ\96 Ð´Ñ\96Ñ\97 Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ñ\82Ñ\96лÑ\8cки Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `POST` Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96й.
\9dапÑ\80иклад, Ð¿Ñ\96д Ñ\87аÑ\81 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f GraphQL Ð²Ð¸ Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\94Ñ\82е Ð²Ñ\81Ñ\96 Ð´Ñ\96Ñ\97, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ð»Ð¸Ñ\88е `POST` Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97.
 
 ///
 
-### Крок 4: визначте **функцію операції шляху (path operation function)**
+### Крок 4: визначте **функцію операції шляху** { #step-4-define-the-path-operation-function }
 
-Ось "**функція операції шляху**":
+Ось наша «**функція операції шляху**»:
 
 * **шлях**: це `/`.
 * **операція**: це `get`.
-* **функція**: це функція, яка знаходиться нижче "декоратора" (нижче `@app.get("/")`).
+* **функція**: це функція нижче «декоратора» (нижче `@app.get("/")`).
 
-{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
+{* ../../docs_src/first_steps/tutorial001_py39.py hl[7] *}
 
-Це звичайна функція Python.
+Це функція Python.
 
-FastAPI викликатиме її щоразу, коли отримає запит до URL із шляхом "/", використовуючи операцію `GET`.
+**FastAPI** викликатиме її щоразу, коли отримає запит до URL «`/`», використовуючи операцію `GET`.
 
-У даному випадку це асинхронна функція.
+У цьому випадку це `async` функція.
 
 ---
 
 Ви також можете визначити її як звичайну функцію замість `async def`:
 
-{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
+{* ../../docs_src/first_steps/tutorial003_py39.py hl[7] *}
 
 /// note | Примітка
 
-ЯкÑ\89о Ð½Ðµ Ð·Ð½Ð°Ñ\94Ñ\82е Ð² Ñ\87омÑ\83 Ñ\80Ñ\96зниÑ\86Ñ\8f, Ð¿Ð¾Ð´Ð¸Ð²Ñ\96Ñ\82Ñ\8cÑ\81Ñ\8f [Ð\9aонкÑ\83Ñ\80енÑ\82нÑ\96Ñ\81Ñ\82Ñ\8c: *"Ð\9fоÑ\81пÑ\96Ñ\88аÑ\94Ñ\88?"*](../async.md#in-a-hurry){.internal-link target=_blank}.
+ЯкÑ\89о Ð²Ð¸ Ð½Ðµ Ð·Ð½Ð°Ñ\94Ñ\82е Ñ\80Ñ\96зниÑ\86Ñ\8e, Ð¿Ð¾Ð´Ð¸Ð²Ñ\96Ñ\82Ñ\8cÑ\81Ñ\8f [Ð\90Ñ\81инÑ\85Ñ\80оннÑ\96Ñ\81Ñ\82Ñ\8c: *«Ð\9fоÑ\81пÑ\96Ñ\88аÑ\94Ñ\82е?»*](../async.md#in-a-hurry){.internal-link target=_blank}.
 
 ///
 
-### Крок 5: поверніть результат
+### Крок 5: поверніть вміст { #step-5-return-the-content }
 
-{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
+{* ../../docs_src/first_steps/tutorial001_py39.py hl[8] *}
 
-Ви можете повернути `dict`, `list`, а також окремі значення `str`, `int`, ітд.
+Ви можете повернути `dict`, `list`, а також окремі значення `str`, `int` тощо.
 
 Також можна повернути моделі Pydantic (про це ви дізнаєтесь пізніше).
 
-Існує багато інших об'єктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені, велика ймовірність, що вони вже підтримуються.
+Існує багато інших обʼєктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені — велика ймовірність, що вони вже підтримуються.
+
+### Крок 6: розгорніть його { #step-6-deploy-it }
+
+Розгорніть ваш застосунок у **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** однією командою: `fastapi deploy`. 🎉
+
+#### Про FastAPI Cloud { #about-fastapi-cloud }
+
+**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** створено тим самим автором і командою, які стоять за **FastAPI**.
+
+Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
+
+Він переносить той самий **досвід розробника** зі створення застосунків на FastAPI на **розгортання** їх у хмарі. 🎉
+
+FastAPI Cloud — основний спонсор і джерело фінансування для open source проєктів *FastAPI and friends*. ✨
+
+#### Розгортання в інших хмарних провайдерах { #deploy-to-other-cloud-providers }
+
+FastAPI — це open source і базується на стандартах. Ви можете розгортати FastAPI-застосунки у будь-якого хмарного провайдера на ваш вибір.
+
+Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути FastAPI-застосунки з їхньою допомогою. 🤓
 
-## Підіб'ємо підсумки
+## Підібʼємо підсумки { #recap }
 
-* Імпортуємо `FastAPI`.
-* Створюємо екземпляр `app`.
-* Пишемо **декоратор операції шляху** як `@app.get("/")`.
-* Пишемо **функцію операції шляху**; наприклад, `def root(): ...`.
-* Запускаємо сервер у режимі розробки `fastapi dev`.
+* Імпортуйте `FastAPI`.
+* Створіть екземпляр `app`.
+* Напишіть **декоратор операції шляху**, використовуючи декоратори на кшталт `@app.get("/")`.
+* Визначте **функцію операції шляху**; наприклад, `def root(): ...`.
+* Запустіть сервер розробки командою `fastapi dev`.
+* За бажанням розгорніть ваш застосунок за допомогою `fastapi deploy`.
index 32de73b2a04d5e867e3830f24410a58d3aef8fdd..53b8b12f618c299ee1ad84b49d80dbb42b80255e 100644 (file)
@@ -1,10 +1,10 @@
-# Ð\9eбÑ\80обка Ð\9fомилок
+# Ð\9eбÑ\80обка Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº { #handling-errors }
 
\84 Ð±Ð°Ð³Ð°Ñ\82о Ñ\81иÑ\82Ñ\83аÑ\86Ñ\96й, ÐºÐ¾Ð»Ð¸ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿Ð¾Ð²Ñ\96домиÑ\82и ÐºÐ»Ñ\96Ñ\94нÑ\82а, Ñ\8fкий Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 Ð\92аÑ\88 API, Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83.
\84 Ð±Ð°Ð³Ð°Ñ\82о Ñ\81иÑ\82Ñ\83аÑ\86Ñ\96й, ÐºÐ¾Ð»Ð¸ Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿Ð¾Ð²Ñ\96домиÑ\82и Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 ÐºÐ»Ñ\96Ñ\94нÑ\82а, Ñ\8fкий Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 Ð²Ð°Ñ\88 API.
 
 Цим клієнтом може бути браузер із фронтендом, код іншого розробника, IoT-пристрій тощо.
 
\9cожливо, Ð\92ам потрібно повідомити клієнта, що:
\9cожливо, Ð²ам потрібно повідомити клієнта, що:
 
 * У нього недостатньо прав для виконання цієї операції.
 * Він не має доступу до цього ресурсу.
 
 У таких випадках зазвичай повертається **HTTP статус-код** в діапазоні **400** (від 400 до 499).
 
-Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці "200" статус-коди означають, що запит пройшов успішно.
+Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці «200» статус-коди означають, що якимось чином запит був «успішним».
 
 Статус-коди в діапазоні 400 означають, що сталася помилка з боку клієнта.
 
-Пам'ятаєте всі ці помилки **404 Not Found** (і жарти про них)?
+Пам'ятаєте всі ці помилки **«404 Not Found»** (і жарти про них)?
 
-## Використання `HTTPException`
+## Використання `HTTPException` { #use-httpexception }
 
 Щоб повернути HTTP-відповіді з помилками клієнту, використовуйте `HTTPException`.
 
-### Імпорт `HTTPException`
+### Імпорт `HTTPException` { #import-httpexception }
 
-{* ../../docs_src/handling_errors/tutorial001.py hl[1] *}
+{* ../../docs_src/handling_errors/tutorial001_py39.py hl[1] *}
 
-### Ð\92икоÑ\80иÑ\81Ñ\82аннÑ\8f `HTTPException` Ñ\83 ÐºÐ¾Ð´Ñ\96
+### Ð\97генеÑ\80Ñ\83йÑ\82е `HTTPException` Ñ\83 Ñ\81воÑ\94мÑ\83 ÐºÐ¾Ð´Ñ\96 { #raise-an-httpexception-in-your-code }
 
 `HTTPException` — це звичайна помилка Python із додатковими даними, які стосуються API.
 
\9eÑ\81кÑ\96лÑ\8cки Ñ\86е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Python, Ð\92и Ð½Ðµ `повеÑ\80Ñ\82аÑ\94Ñ\82е` Ð¹Ð¾Ð³Ð¾, Ð° `генеÑ\80Ñ\83Ñ\94Ñ\82е` (генеÑ\80Ñ\83Ñ\94Ñ\82е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83).
\9eÑ\81кÑ\96лÑ\8cки Ñ\86е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Python, Ð²Ð¸ Ð½Ðµ `return` Ñ\97Ñ\97, Ð° `raise` Ñ\97Ñ\97.
 
-Це Ñ\82акож Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ñ\8fкÑ\89о Ð\92и Ð¿ÐµÑ\80ебÑ\83ваÑ\94Ñ\82е Ð²Ñ\81еÑ\80единÑ\96 Ð´Ð¾Ð¿Ð¾Ð¼Ñ\96жноÑ\97 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\8fкÑ\83 Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\94Ñ\82е Ð²Ñ\81еÑ\80единÑ\96 Ñ\81воÑ\94Ñ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*, Ñ\96 Ñ\82ам Ð³ÐµÐ½ÐµÑ\80Ñ\83Ñ\94Ñ\82е `HTTPException`, всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
+Це Ñ\82акож Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ñ\8fкÑ\89о Ð²Ð¸ Ð¿ÐµÑ\80ебÑ\83ваÑ\94Ñ\82е Ð²Ñ\81еÑ\80единÑ\96 Ð´Ð¾Ð¿Ð¾Ð¼Ñ\96жноÑ\97 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\8fкÑ\83 Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\94Ñ\82е Ð²Ñ\81еÑ\80единÑ\96 Ñ\81воÑ\94Ñ\97 *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*, Ñ\96 Ñ\82ам Ð·Ð³ÐµÐ½ÐµÑ\80Ñ\83Ñ\94Ñ\82е `HTTPException` всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
 
\9fеÑ\80евага Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f `генеÑ\80аÑ\86Ñ\96Ñ\97` (raise) Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c `повеÑ\80неннÑ\8f` Ð·Ð½Ð°Ñ\87еннÑ\8f (return) Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88 Ð¾Ñ\87евидним Ð² Ñ\80оздÑ\96лÑ\96 Ð¿Ñ\80о Ð\97алежноÑ\81Ñ\82Ñ\96 Ñ\82а Ð\91езпеку.
\9fеÑ\80евага Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ð²Ð¸ÐºÐ»Ñ\8eÑ\87еннÑ\8f Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ð·Ð½Ð°Ñ\87еннÑ\8f Ñ\81Ñ\82ане Ð±Ñ\96лÑ\8cÑ\88 Ð¾Ñ\87евидноÑ\8e Ð² Ñ\80оздÑ\96лÑ\96 Ð¿Ñ\80о Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82Ñ\96 Ñ\82а Ð±езпеку.
 
-У цьому прикладі, якщо клієнт запитує елемент за ID, якого не існує, буде згенеровано помилку зі статус-кодом `404`:
+У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`:
 
-{* ../../docs_src/handling_errors/tutorial001.py hl[11] *}
+{* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *}
 
-### Отримана відповідь
+### Отримана відповідь { #the-resulting-response }
 
-Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає статус-код 200 і JSON відповідь:
+Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає HTTP статус-код 200 і JSON відповідь:
 
 ```JSON
 {
@@ -51,7 +51,7 @@
 }
 ```
 
-Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає статус-код 404 (помилка "не знайдено") та відповідь:
+Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає HTTP статус-код 404 (помилка «не знайдено») та JSON відповідь:
 
 ```JSON
 {
@@ -61,7 +61,7 @@
 
 /// tip | Порада
 
\9fÑ\96д Ñ\87аÑ\81 Ð²Ð¸ÐºÐ»Ð¸ÐºÑ\83 `HTTPException` Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80едаÑ\82и Ð±Ñ\83дÑ\8c\8fке Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fке Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ð¿ÐµÑ\80еÑ\82воÑ\80ене Ð² JSON, Ñ\8fк Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `detail`, Ð° Ð½Ðµ Ð»Ð¸Ñ\88е Ñ\80Ñ\8fдок (`str`).
\9fÑ\96д Ñ\87аÑ\81 Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\97 `HTTPException` Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80едаÑ\82и Ð±Ñ\83дÑ\8c\8fке Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fке Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ð¿ÐµÑ\80еÑ\82воÑ\80ене Ð² JSON, Ñ\8fк Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `detail`, Ð° Ð½Ðµ Ð»Ð¸Ñ\88е `str`.
 
 Ви можете передати `dict`, `list` тощо.
 
 
 ///
 
-## Додавання власних заголовків
+## Додавання власних заголовків { #add-custom-headers }
 
\86нодÑ\96 Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð´Ð¾Ð´Ð°Ñ\82и Ð²Ð»Ð°Ñ\81нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Ð´Ð¾ HTTP-помилки, Ð½Ð°Ð¿Ñ\80иклад, Ð´Ð»Ñ\8f Ð¿ÐµÐ²Ð½их типів безпеки.
\84 Ð´ÐµÑ\8fкÑ\96 Ñ\81иÑ\82Ñ\83аÑ\86Ñ\96Ñ\97, ÐºÐ¾Ð»Ð¸ ÐºÐ¾Ñ\80иÑ\81но Ð¼Ð°Ñ\82и Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96Ñ\81Ñ\82Ñ\8c Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и Ð²Ð»Ð°Ñ\81нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Ð´Ð¾ HTTP-помилки. Ð\9dапÑ\80иклад, Ð´Ð»Ñ\8f Ð´ÐµÑ\8fких типів безпеки.
 
\99мовÑ\96Ñ\80но, Ð\92ам не доведеться використовувати це безпосередньо у своєму коді.
\99мовÑ\96Ñ\80но, Ð²ам не доведеться використовувати це безпосередньо у своєму коді.
 
\90ле Ñ\8fкÑ\89о Ð\92ам Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\86е Ð´Ð»Ñ\8f Ñ\81кладного Ñ\81Ñ\86енаÑ\80Ñ\96Ñ\8e, Ð\92и можете додати власні заголовки:
\90ле Ñ\8fкÑ\89о Ð²Ð°Ð¼ Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\86е Ð´Ð»Ñ\8f Ñ\81кладного Ñ\81Ñ\86енаÑ\80Ñ\96Ñ\8e, Ð²и можете додати власні заголовки:
 
-{* ../../docs_src/handling_errors/tutorial002.py hl[14] *}
+{* ../../docs_src/handling_errors/tutorial002_py39.py hl[14] *}
 
-## Ð\92Ñ\81Ñ\82ановленнÑ\8f Ð²Ð»Ð°Ñ\81ниÑ\85 Ð¾Ð±Ñ\80обникÑ\96в Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº
+## Ð\92Ñ\81Ñ\82ановленнÑ\8f Ð²Ð»Ð°Ñ\81ниÑ\85 Ð¾Ð±Ñ\80обникÑ\96в Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c { #install-custom-exception-handlers }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ð²Ð»Ð°Ñ\81нÑ\96 Ð¾Ð±Ñ\80обники Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e <a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">Ñ\82иÑ\85 Ñ\81амиÑ\85 Ñ\83Ñ\82илÑ\96Ñ\82 Ð¾Ð±Ñ\80обки Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº зі Starlette</a>.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ð²Ð»Ð°Ñ\81нÑ\96 Ð¾Ð±Ñ\80обники Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e <a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">Ñ\82иÑ\85 Ñ\81амиÑ\85 Ñ\83Ñ\82илÑ\96Ñ\82 Ð´Ð»Ñ\8f Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c зі Starlette</a>.
 
-Припустимо, у Вас є власний обʼєкт помилки `UnicornException`, яке Ви (або бібліотека, яку Ви використовуєте) може `згенерувати` (`raise`).
+Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`.
 
\86 Ð\92и хочете обробляти це виключення глобально за допомогою FastAPI.
\86 Ð²и хочете обробляти це виключення глобально за допомогою FastAPI.
 
 Ви можете додати власний обробник виключень за допомогою `@app.exception_handler()`:
 
-{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *}
+{* ../../docs_src/handling_errors/tutorial003_py39.py hl[5:7,13:18,24] *}
 
-ТÑ\83Ñ\82, Ñ\8fкÑ\89о Ð\92и Ð·Ð²ÐµÑ\80неÑ\82еÑ\81Ñ\8f Ð´Ð¾ `/unicorns/yolo`, Ñ\82о Ð·Ð³ÐµÐ½ÐµÑ\80Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° `UnicornException`.
+ТÑ\83Ñ\82, Ñ\8fкÑ\89о Ð²Ð¸ Ð·Ð²ÐµÑ\80неÑ\82еÑ\81Ñ\8f Ð´Ð¾ `/unicorns/yolo`, *опеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\88лÑ\8fÑ\85Ñ\83* Ð·Ð³ÐµÐ½ÐµÑ\80Ñ\83Ñ\94 (`raise`) `UnicornException`.
 
 Але вона буде оброблена функцією-обробником `unicorn_exception_handler`.
 
\9eÑ\82же, Ð\92и Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е Ð·Ñ\80озÑ\83мÑ\96лÑ\83 Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ð·Ñ\96 HTTP-Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81ом `418` Ñ\96 JSON-вÑ\96дповÑ\96ддÑ\8e:
\9eÑ\82же, Ð²Ð¸ Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е Ð·Ñ\80озÑ\83мÑ\96лÑ\83 Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ð·Ñ\96 HTTP-Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81ом `418` Ñ\96 JSON-вмÑ\96Ñ\81Ñ\82ом:
 
 ```JSON
 {"message": "Oops! yolo did something. There goes a rainbow..."}
 
 Ви також можете використовувати `from starlette.requests import Request` і `from starlette.responses import JSONResponse`.
 
-**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette. Те ж саме стосується і `Request`.
+**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності для вас, розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette. Те ж саме з `Request`.
 
 ///
 
-## Ð\9fеÑ\80евизнаÑ\87еннÑ\8f Ð¾Ð±Ñ\80обникÑ\96в Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм
+## Ð\9fеÑ\80евизнаÑ\87еннÑ\8f Ð¾Ð±Ñ\80обникÑ\96в Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм { #override-the-default-exception-handlers }
 
-**FastAPI** Ð¼Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ð¾Ð±Ñ\80обникÑ\96в Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº за замовчуванням.
+**FastAPI** Ð¼Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ð¾Ð±Ñ\80обникÑ\96в Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c за замовчуванням.
 
-ЦÑ\96 Ð¾Ð±Ñ\80обники Ð²Ñ\96дповÑ\96даÑ\8eÑ\82Ñ\8c Ð·Ð° Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\85 JSON-вÑ\96дповÑ\96дей, ÐºÐ¾Ð»Ð¸ Ð\92и `генеÑ\80Ñ\83Ñ\94Ñ\82е` (`raise`) `HTTPException`, а також коли запит містить некоректні дані.
+ЦÑ\96 Ð¾Ð±Ñ\80обники Ð²Ñ\96дповÑ\96даÑ\8eÑ\82Ñ\8c Ð·Ð° Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\85 JSON-вÑ\96дповÑ\96дей, ÐºÐ¾Ð»Ð¸ Ð²Ð¸ `raise` `HTTPException`, а також коли запит містить некоректні дані.
 
-Ви можете перевизначити ці обробники, створивши власні.
+Ви можете перевизначити ці обробники виключень власними.
 
-### Ð\9fеÑ\80евизнаÑ\87еннÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\97 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83
+### Ð\9fеÑ\80евизнаÑ\87еннÑ\8f Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\97 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 { #override-request-validation-exceptions }
 
-Коли запит містить некоректні дані, **FastAPI** генерує `RequestValidationError`.
\9aоли Ð·Ð°Ð¿Ð¸Ñ\82 Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð½ÐµÐºÐ¾Ñ\80екÑ\82нÑ\96 Ð´Ð°Ð½Ñ\96, **FastAPI** Ð²Ð½Ñ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8cо Ð³ÐµÐ½ÐµÑ\80Ñ\83Ñ\94 `RequestValidationError`.
 
\86 Ñ\82акож Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 Ð¾Ð±Ñ\80обник Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº за замовчуванням для нього.
\86 Ñ\82акож Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 Ð¾Ð±Ñ\80обник Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c за замовчуванням для нього.
 
-Щоб Ð¿ÐµÑ\80евизнаÑ\87иÑ\82и Ð¹Ð¾Ð³Ð¾, Ñ\96мпоÑ\80Ñ\82Ñ\83йÑ\82е `RequestValidationError` Ñ\96 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83йÑ\82е Ð¹Ð¾Ð³Ð¾ Ð· `@app.exception_handler(RequestValidationError)` Ð´Ð»Ñ\8f Ð´ÐµÐºÐ¾Ñ\80Ñ\83ваннÑ\8f Ð¾Ð±Ñ\80обника Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº.
+Щоб Ð¿ÐµÑ\80евизнаÑ\87иÑ\82и Ð¹Ð¾Ð³Ð¾, Ñ\96мпоÑ\80Ñ\82Ñ\83йÑ\82е `RequestValidationError` Ñ\96 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83йÑ\82е Ð¹Ð¾Ð³Ð¾ Ð· `@app.exception_handler(RequestValidationError)` Ð´Ð»Ñ\8f Ð´ÐµÐºÐ¾Ñ\80Ñ\83ваннÑ\8f Ð¾Ð±Ñ\80обника Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c.
 
\9eбÑ\80обник Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð¾Ñ\82Ñ\80имÑ\83Ñ\94 `Request` Ñ\96 Ñ\81амÑ\83 Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83.
\9eбÑ\80обник Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð¾Ñ\82Ñ\80имаÑ\94 `Request` Ñ\96 Ñ\81аме Ð²Ð¸ÐºÐ»Ñ\8eÑ\87еннÑ\8f.
 
-{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
+{* ../../docs_src/handling_errors/tutorial004_py39.py hl[2,14:19] *}
 
-ТепеÑ\80, Ñ\8fкÑ\89о Ð\92и перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку:
+ТепеÑ\80, Ñ\8fкÑ\89о Ð²и перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку:
 
 ```JSON
 {
 }
 ```
 
\92и отримаєте текстову версію:
²и отримаєте текстову версію:
 
 ```
-1 validation error
-path -> item_id
-  value is not a valid integer (type=type_error.integer)
+Validation errors:
+Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer
 ```
 
-#### `RequestValidationError` проти `ValidationError`
+### Перевизначення обробника помилок `HTTPException` { #override-the-httpexception-error-handler }
 
-/// warning | Увага
+Аналогічно, ви можете перевизначити обробник `HTTPException`.
 
¦Ðµ Ñ\82еÑ\85нÑ\96Ñ\87нÑ\96 Ð´ÐµÑ\82алÑ\96, Ñ\8fкÑ\96 Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82и, Ñ\8fкÑ\89о Ð²Ð¾Ð½Ð¸ Ð·Ð°Ñ\80аз Ð½Ðµ Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ\96 Ð´Ð»Ñ\8f Ð\92аÑ\81.
\9dапÑ\80иклад, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ñ\85оÑ\82Ñ\96Ñ\82и Ð¿Ð¾Ð²ÐµÑ\80нÑ\83Ñ\82и Ð²Ñ\96дповÑ\96дÑ\8c Ñ\83 Ð²Ð¸Ð³Ð»Ñ\8fдÑ\96 Ð¿Ñ\80оÑ\81Ñ\82ого Ñ\82екÑ\81Ñ\82Ñ\83 Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c JSON Ð´Ð»Ñ\8f Ñ\86иÑ\85 Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº:
 
-///
-
-`RequestValidationError` є підкласом Pydantic <a href="https://docs.pydantic.dev/latest/concepts/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>.
-
-**FastAPI** використовує його для того, якщо Ви використовуєте модель Pydantic у `response_model` і у ваших даних є помилка, Ви побачили помилку у своєму журналі.
-
-Але клієнт/користувач не побачить її. Натомість клієнт отримає "Internal Server Error" зі статусом HTTP `500`.
-
-Так має бути, якщо у Вас виникла `ValidationError` Pydantic у *відповіді* або деінде у вашому коді (не у *запиті* клієнта), це насправді є помилкою у Вашому коді.
-
-І поки Ви її виправляєте, клієнти/користувачі не повинні мати доступу до внутрішньої інформації про помилку, оскільки це може призвести до вразливості безпеки.
+{* ../../docs_src/handling_errors/tutorial004_py39.py hl[3:4,9:11,25] *}
 
-### Перевизначення обробника помилок `HTTPException`
+/// note | Технічні деталі
 
\90налогÑ\96Ñ\87но, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80евизнаÑ\87иÑ\82и Ð¾Ð±Ñ\80обник `HTTPException`.
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `from starlette.responses import PlainTextResponse`.
 
-Наприклад, Ви можете захотіти повернути текстову відповідь замість JSON для цих помилок:
+**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності для вас, розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette.
 
-{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
+///
 
-/// note | Технічні деталі
+/// warning | Попередження
 
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `from starlette.responses import PlainTextResponse`.
\9fамâ\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о `RequestValidationError` Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¿Ñ\80о Ð½Ð°Ð·Ð²Ñ\83 Ñ\84айлÑ\83 Ñ\82а Ñ\80Ñ\8fдок, Ð´Ðµ Ñ\81Ñ\82алаÑ\81Ñ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\97, Ñ\89об Ð·Ð° Ð¿Ð¾Ñ\82Ñ\80еби Ð²Ð¸ Ð¼Ð¾Ð³Ð»Ð¸ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ\82и Ñ\86е Ñ\83 Ñ\81воÑ\97Ñ\85 Ð»Ð¾Ð³Ð°Ñ\85 Ñ\96з Ð²Ñ\96дповÑ\96дноÑ\8e Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\94Ñ\8e.
 
-**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette.
+Але це означає, що якщо ви просто перетворите це на рядок і повернете цю інформацію напряму, ви можете розкрити трохи інформації про вашу систему, тому тут код витягає та показує кожну помилку незалежно.
 
 ///
 
-### Використання тіла `RequestValidationError`
+### Використання тіла `RequestValidationError` { #use-the-requestvalidationerror-body }
 
 `RequestValidationError` містить `body`, який він отримав із некоректними даними.
 
 Ви можете використовувати це під час розробки свого додатка, щоб логувати тіло запиту та налагоджувати його, повертати користувачеві тощо.
 
-{* ../../docs_src/handling_errors/tutorial005.py hl[14] *}
+{* ../../docs_src/handling_errors/tutorial005_py39.py hl[14] *}
 
 Тепер спробуйте надіслати некоректний елемент, наприклад:
 
@@ -204,8 +193,8 @@ path -> item_id
   "size": "XL"
 }
 ```
-Ви отримаєте відповідь, яка повідомить Вам, які саме дані є некоректні у вашому тілі запиту:
 
+Ви отримаєте відповідь, яка повідомить вам, що дані є некоректними, і міститиме отримане тіло запиту:
 
 ```JSON hl_lines="12-15"
 {
@@ -226,30 +215,30 @@ path -> item_id
 }
 ```
 
-#### `HTTPException` FastAPI проти `HTTPException` Starlette
+#### `HTTPException` FastAPI проти `HTTPException` Starlette { #fastapis-httpexception-vs-starlettes-httpexception }
 
 **FastAPI** має власний `HTTPException`.
 
-І клас помилки `HTTPException` в **FastAPI** успадковується від класу помилки `HTTPException` в Starlette.
+І клас помилки `HTTPException` в **FastAPI** успадковується від класу помилки `HTTPException` у Starlette.
 
 Єдина різниця полягає в тому, що `HTTPException` в **FastAPI** приймає будь-які дані, які можна перетворити на JSON, для поля `detail`, тоді як `HTTPException` у Starlette приймає тільки рядки.
 
\9eÑ\82же, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80одовжÑ\83ваÑ\82и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `HTTPException` Ð² **FastAPI** як зазвичай у своєму коді.
\9eÑ\82же, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80одовжÑ\83ваÑ\82и Ð³ÐµÐ½ÐµÑ\80Ñ\83ваÑ\82и `HTTPException` **FastAPI** як зазвичай у своєму коді.
 
\90ле ÐºÐ¾Ð»Ð¸ Ð\92и реєструєте обробник виключень, слід реєструвати його для `HTTPException` зі Starlette.
\90ле ÐºÐ¾Ð»Ð¸ Ð²и реєструєте обробник виключень, слід реєструвати його для `HTTPException` зі Starlette.
 
-Таким чином, якщо будь-яка частина внутрішнього коду Starlette або розширення чи плагін Starlette згенерує (raise) `HTTPException`, Ваш обробник зможе перехопити та обробити її.
+Таким чином, якщо будь-яка частина внутрішнього коду Starlette або розширення чи плагін Starlette згенерує Starlette `HTTPException`, ваш обробник зможе перехопити та обробити її.
 
-У Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96, Ñ\89об Ð¼Ð°Ñ\82и Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¾Ð±Ð¸Ð´Ð²Ð° `HTTPException` Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ\83 ÐºÐ¾Ð´Ñ\96, Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Starlette перейменовується на `StarletteHTTPException`:
+У Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96, Ñ\89об Ð¼Ð°Ñ\82и Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¾Ð±Ð¸Ð´Ð²Ð° `HTTPException` Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ\83 ÐºÐ¾Ð´Ñ\96, Ð²Ð¸ÐºÐ»Ñ\8eÑ\87еннÑ\8f Starlette перейменовується на `StarletteHTTPException`:
 
 ```Python
 from starlette.exceptions import HTTPException as StarletteHTTPException
 ```
 
-### Ð\9fовÑ\82оÑ\80не Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f Ð¾Ð±Ñ\80обникÑ\96в Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº **FastAPI**
+### Ð\9fовÑ\82оÑ\80не Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f Ð¾Ð±Ñ\80обникÑ\96в Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c **FastAPI** { #reuse-fastapis-exception-handlers }
 
-ЯкÑ\89о Ð\92и Ñ\85оÑ\87еÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ Ñ\80азом Ñ\96з Ñ\82акими Ð¶ Ð¾Ð±Ñ\80обниками Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, Ñ\8fк Ñ\83 **FastAPI**, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\96мпоÑ\80Ñ\82Ñ\83ваÑ\82и Ñ\82а Ð¿Ð¾Ð²Ñ\82оÑ\80но Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\97Ñ\85 із `fastapi.exception_handlers`:
+ЯкÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð²Ð¸ÐºÐ»Ñ\8eÑ\87еннÑ\8f Ñ\80азом Ñ\96з Ñ\82акими Ð¶ Ð¾Ð±Ñ\80обниками Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, Ñ\8fк Ñ\83 **FastAPI**, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\96мпоÑ\80Ñ\82Ñ\83ваÑ\82и Ñ\82а Ð¿Ð¾Ð²Ñ\82оÑ\80но Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ð¾Ð±Ñ\80обники Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм із `fastapi.exception_handlers`:
 
-{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *}
+{* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *}
 
-У Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 Ð\92и Ð¿Ñ\80оÑ\81Ñ\82о Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `print` Ð´Ð»Ñ\8f Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ\8f Ð´Ñ\83же Ñ\96нÑ\84оÑ\80маÑ\82ивного Ð¿Ð¾Ð²Ñ\96домленнÑ\8f, Ð°Ð»Ðµ Ð\92и Ð·Ñ\80озÑ\83мÑ\96ли Ð¾Ñ\81новнÑ\83 Ñ\96деÑ\8e. Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð±Ñ\80обиÑ\82и Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ñ\82а Ð¿Ð¾Ð²Ñ\82оÑ\80но Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¾Ð±Ñ\80обники Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº за замовчуванням.
+У Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 Ð²Ð¸ Ð¿Ñ\80оÑ\81Ñ\82о Ð´Ñ\80Ñ\83кÑ\83Ñ\94Ñ\82е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ð· Ð´Ñ\83же Ð²Ð¸Ñ\80азним Ð¿Ð¾Ð²Ñ\96домленнÑ\8fм, Ð°Ð»Ðµ Ð²Ð¸ Ð·Ñ\80озÑ\83мÑ\96ли Ð¾Ñ\81новнÑ\83 Ñ\96деÑ\8e. Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð²Ð¸ÐºÐ»Ñ\8eÑ\87еннÑ\8f, Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð¿Ñ\80оÑ\81Ñ\82о Ð¿Ð¾Ð²Ñ\82оÑ\80но Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ð¾Ð±Ñ\80обники Ð²Ð¸ÐºÐ»Ñ\8eÑ\87енÑ\8c за замовчуванням.
index 6f7b0bdae7c9bda52bf2d2038da92e19c9366044..c080c19f063d2ba8eccd3f8ebd561619513aadbe 100644 (file)
@@ -1,26 +1,24 @@
-# Ð\9cоделÑ\96 Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\96в Ð\97аголовкÑ\96в
+# Ð\9cоделÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ\96в { #header-parameter-models }
 
-Якщо у Вас є група пов’язаних параметрів заголовків, Ви можете створити **Pydantic модель** для їх оголошення.
+Якщо у Вас є група пов’язаних **параметрів заголовків**, Ви можете створити **Pydantic модель** для їх оголошення.
 
 Це дозволить Вам повторно **використовувати модель** в **різних місцях**, а також оголосити валідації та метадані для всіх параметрів одночасно. 😎
 
-/// note | Ð\9dоÑ\82аÑ\82ки
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
 Ця можливість підтримується починаючи з версії FastAPI `0.115.0`. 🤓
 
 ///
 
-## Ð\9fаÑ\80амеÑ\82Ñ\80и Ð\97аголовкÑ\96в Ð· Ð\92икоÑ\80иÑ\81Ñ\82аннÑ\8fм Pydantic Model
+## Ð\9fаÑ\80амеÑ\82Ñ\80и Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ\96в Ð· Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8fм Pydantic Ð¼Ð¾Ð´ÐµÐ»Ñ\96 { #header-parameters-with-a-pydantic-model }
 
 Оголосіть потрібні **параметри заголовків** у **Pydantic моделі**, а потім оголосіть параметр як `Header`:
 
 {* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
 
-FastAPI буде витягувати дані для кожного поля з заголовків у запиті та передавати їх у створену Вами Pydantic модель.
-
 **FastAPI** буде **витягувати** дані для **кожного поля** з **заголовків** у запиті та передавати їх у створену Вами Pydantic модель.
 
-## Ð\9fеÑ\80евÑ\96Ñ\80ка Ð² Ð\94окÑ\83менÑ\82аÑ\86Ñ\96Ñ\97
+## Ð\9fеÑ\80евÑ\96Ñ\80ка Ð² Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 { #check-the-docs }
 
 Ви можете побачити необхідні заголовки в інтерфейсі документації за адресою `/docs`:
 
@@ -28,7 +26,7 @@ FastAPI буде витягувати дані для кожного поля з
 <img src="/img/tutorial/header-param-models/image01.png">
 </div>
 
-## Ð\97абоÑ\80она Ð\94одаÑ\82ковиÑ\85 Ð\97аголовкÑ\96в
+## Ð\97абоÑ\80ониÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ { #forbid-extra-headers }
 
 У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** заголовки, які хочете отримати.
 
@@ -38,7 +36,7 @@ FastAPI буде витягувати дані для кожного поля з
 
 Якщо клієнт спробує надіслати **додаткові заголовки**, він отримає **помилку** у відповіді.
 
-Наприклад, якщо клієнт спробує надіслати заголовок `tool` зі значенням `plumbus`, він отримає  **помилку** з повідомленням про те, що параметр заголовка `tool` не дозволений:
+Наприклад, якщо клієнт спробує надіслати заголовок `tool` зі значенням `plumbus`, він отримає **помилку** у відповіді з повідомленням про те, що параметр заголовка `tool` не дозволений:
 
 ```json
 {
@@ -53,6 +51,22 @@ FastAPI буде витягувати дані для кожного поля з
 }
 ```
 
-## Підсумок
+## Вимкнути перетворення підкреслень { #disable-convert-underscores }
+
+Так само, як і зі звичайними параметрами заголовків, коли у назвах параметрів є символи підкреслення, вони **автоматично перетворюються на дефіси**.
+
+Наприклад, якщо у коді у Вас є параметр заголовка `save_data`, очікуваний HTTP-заголовок буде `save-data`, і він так само відображатиметься в документації.
+
+Якщо з якоїсь причини Вам потрібно вимкнути це автоматичне перетворення, Ви також можете зробити це для Pydantic моделей для параметрів заголовків.
+
+{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *}
+
+/// warning | Попередження
+
+Перш ніж встановлювати `convert_underscores` у значення `False`, пам’ятайте, що деякі HTTP проксі та сервери забороняють використання заголовків із підкресленнями.
+
+///
+
+## Підсумок { #summary }
 
 Ви можете використовувати **Pydantic моделі** для оголошення **заголовків** у **FastAPI**. 😎
index 09c70a4f61a11d4ad0c1e8b336dc97040f35e098..f5a4ea18d187f5fbe57316397c91311b140f47af 100644 (file)
@@ -1,14 +1,14 @@
-# Header-параметри
+# Параметри заголовків { #header-parameters }
 
-Ви можете визначати параметри заголовків, так само як визначаєте `Query`, `Path` і `Cookie` параметри.
+Ви можете визначати параметри заголовків так само, як визначаєте параметри `Query`, `Path` і `Cookie`.
 
-## Імпорт `Header`
+## Імпорт `Header` { #import-header }
 
 Спочатку імпортуйте `Header`:
 
 {* ../../docs_src/header_params/tutorial001_an_py310.py hl[3] *}
 
-## Оголошення параметрів `Header`
+## Оголошення параметрів `Header` { #declare-header-parameters }
 
 Потім оголосіть параметри заголовків, використовуючи ту ж структуру, що й для `Path`, `Query` та `Cookie`.
 
@@ -18,9 +18,9 @@
 
 /// note | Технічні деталі
 
-`Header`є "сестринським" класом для `Path`, `Query` і `Cookie`. Він також успадковується від загального класу `Param`.
+`Header` є «сестринським» класом для `Path`, `Query` і `Cookie`. Він також успадковується від того ж спільного класу `Param`.
 
\90ле Ð¿Ð°Ð¼â\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о Ð¿Ñ\80и Ñ\96мпоÑ\80Ñ\82Ñ\96 `Query`, `Path`, `Header` Ñ\82а Ñ\96нÑ\88иÑ\85 Ñ\96з `fastapi`, Ñ\82о Ð½Ð°Ñ\81пÑ\80авдÑ\96 Ð²Ð¾Ð½Ð¸ Ñ\94 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8fми, які повертають спеціальні класи.
\90ле Ð¿Ð°Ð¼â\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о ÐºÐ¾Ð»Ð¸ Ð²Ð¸ Ñ\96мпоÑ\80Ñ\82Ñ\83Ñ\94Ñ\82е `Query`, `Path`, `Header` Ñ\82а Ñ\96нÑ\88Ñ\96 Ð· `fastapi`, Ñ\82о Ð½Ð°Ñ\81пÑ\80авдÑ\96 Ñ\86е Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, які повертають спеціальні класи.
 
 ///
 
 
 ///
 
-## Автоматичне перетворення
+## Автоматичне перетворення { #automatic-conversion }
 
-`Header` має додатковий функціонал порівняно з `Path`, `Query` та `Cookie`.
+`Header` має трохи додаткової функціональності порівняно з тим, що надають `Path`, `Query` та `Cookie`.
 
-Більшість стандартних заголовків розділяються символом «дефіс», також відомим як «мінус» (`-`).
+Більшість стандартних заголовків розділяються символом «дефіс», також відомим як «символ мінуса» (`-`).
 
 Але змінна, така як `user-agent`, є недійсною в Python.
 
-ТомÑ\83, Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, `Header` Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¿ÐµÑ\80еÑ\82воÑ\80Ñ\8eÑ\94 Ñ\81имволи Ð¿Ñ\96дкÑ\80еÑ\81леннÑ\8f (`_`) Ð½Ð° Ð´ÐµÑ\84Ñ\96Ñ\81и (`-`) Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\82а Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83ваннÑ\8f Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ\96в.
+ТомÑ\83, Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, `Header` Ð¿ÐµÑ\80еÑ\82воÑ\80Ñ\8eваÑ\82име Ñ\81имволи Ð¿Ñ\96дкÑ\80еÑ\81леннÑ\8f (`_`) Ñ\83 Ð½Ð°Ð·Ð²Ð°Ñ\85 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ð½Ð° Ð´ÐµÑ\84Ñ\96Ñ\81и (`-`), Ñ\89об Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ñ\82а Ð´Ð¾ÐºÑ\83менÑ\82Ñ\83ваÑ\82и Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸.
 
\9eÑ\81кÑ\96лÑ\8cки Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ HTTP Ð½Ðµ Ñ\87Ñ\83Ñ\82ливÑ\96 Ð´Ð¾ Ñ\80егÑ\96Ñ\81Ñ\82Ñ\80Ñ\83, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\81Ñ\82андаÑ\80Ñ\82ний Ñ\81Ñ\82илÑ\8c Python ("snake_case").
¢Ð°ÐºÐ¾Ð¶ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ HTTP Ð½Ðµ Ñ\87Ñ\83Ñ\82ливÑ\96 Ð´Ð¾ Ñ\80егÑ\96Ñ\81Ñ\82Ñ\80Ñ\83, Ñ\82ож Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ñ\97Ñ\85 Ñ\83 Ñ\81Ñ\82андаÑ\80Ñ\82номÑ\83 Ñ\81Ñ\82илÑ\96 Python (Ñ\82акож Ð²Ñ\96домомÑ\83 Ñ\8fк Â«snake_case»).
 
-ТомÑ\83 Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `user_agent`, Ñ\8fк Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ñ\83 ÐºÐ¾Ð´Ñ\96 Python, Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ñ\82ого Ñ\89об Ð¿Ð¸Ñ\81аÑ\82и Ð· Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ\97 літери, як `User_Agent` або щось подібне.
+ТомÑ\83 Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `user_agent`, Ñ\8fк Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ñ\83 ÐºÐ¾Ð´Ñ\96 Python, Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ñ\82ого Ñ\89об Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð±Ñ\83ло Ð¿Ð¸Ñ\81аÑ\82и Ð· Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ\97 Ð»Ñ\96Ñ\82еÑ\80и Ð¿ÐµÑ\80Ñ\88Ñ\96 літери, як `User_Agent` або щось подібне.
 
-ЯкÑ\89о Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸Ð¼ÐºÐ½Ñ\83Ñ\82и Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð¿ÐµÑ\80еÑ\82воÑ\80еннÑ\8f Ð¿Ñ\96дкÑ\80еÑ\81ленÑ\8c Ñ\83 Ð´ÐµÑ\84Ñ\96Ñ\81и, Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c `convert_underscores` Ð² `Header` Ð·Ð½Ð°Ñ\87еннÑ\8f `False`:
+ЯкÑ\89о Ð· Ñ\8fкоÑ\97Ñ\81Ñ\8c Ð¿Ñ\80иÑ\87ини Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸Ð¼ÐºÐ½Ñ\83Ñ\82и Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð¿ÐµÑ\80еÑ\82воÑ\80еннÑ\8f Ð¿Ñ\96дкÑ\80еÑ\81ленÑ\8c Ð½Ð° Ð´ÐµÑ\84Ñ\96Ñ\81и, Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `convert_underscores` Ñ\83 `Header` Ð² `False`:
 
 {* ../../docs_src/header_params/tutorial002_an_py310.py hl[10] *}
 
-/// warning | Ð£Ð²Ð°Ð³Ð°
+/// warning | Ð\9fопеÑ\80едженнÑ\8f
 
-Перед тим як встановити значення `False` для `convert_underscores` пам’ятайте, що деякі HTTP-проксі та сервери не підтримують заголовки з підкресленнями.
+Перед тим як встановити `convert_underscores` в `False`, пам’ятайте, що деякі HTTP-проксі та сервери забороняють використання заголовків із підкресленнями.
 
 ///
 
-## Дубльовані заголовки
+## Дубльовані заголовки { #duplicate-headers }
 
-Можливо отримати дубльовані заголовки, тобто той самий заголовок із кількома значеннями.
+Можливо отримати дубльовані заголовки. Тобто один і той самий заголовок із кількома значеннями.
 
¦Ðµ Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81пиÑ\81ок Ñ\83 Ñ\82ипÑ\96заÑ\86Ñ\96Ñ\97 Ð¿Ð°Ñ\80амеÑ\82Ñ\80а.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и Ñ\82акÑ\96 Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81пиÑ\81ок Ñ\83 Ñ\82ипÑ\96заÑ\86Ñ\96Ñ\97.
 
-Ви отримаєте всі значення дубльованого заголовка у вигляді `list` у Python.
+Ви отримаєте всі значення дубльованого заголовка у вигляді Python-`list`.
 
-Наприклад, щоб оголосити заголовок `X-Token`, який може з’являтися більше ніж один раз:
+Наприклад, щоб оголосити заголовок `X-Token`, який може з’являтися більше ніж один раз, ви можете написати:
 
 {* ../../docs_src/header_params/tutorial003_an_py310.py hl[9] *}
 
-ЯкÑ\89о Ð\92и Ð²Ð·Ð°Ñ\94модÑ\96Ñ\94Ñ\82е Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\94Ñ\8e Ñ\88лÑ\8fÑ\85Ñ\83, надсилаючи два HTTP-заголовки, наприклад:
+ЯкÑ\89о Ð²Ð¸ Ð²Ð·Ð°Ñ\94модÑ\96Ñ\94Ñ\82е Ð· Ñ\86Ñ\96Ñ\94Ñ\8e *опеÑ\80аÑ\86Ñ\96Ñ\94Ñ\8e Ñ\88лÑ\8fÑ\85Ñ\83*, надсилаючи два HTTP-заголовки, наприклад:
 
 ```
 X-Token: foo
@@ -84,8 +84,8 @@ X-Token: bar
 }
 ```
 
-## Підсумок
+## Підсумок { #recap }
 
-Оголошуйте заголовки за допомогою `Header`, використовуючи той самий підхід, що й для `Query`, `Path` та `Cookie`.
\9eголоÑ\88Ñ\83йÑ\82е Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Header`, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\82ой Ñ\81амий Ð·Ð°Ð³Ð°Ð»Ñ\8cний Ð¿Ñ\96дÑ\85Ñ\96д, Ñ\89о Ð¹ Ð´Ð»Ñ\8f `Query`, `Path` Ñ\82а `Cookie`.
 
\9dе Ñ\85вилÑ\8eйÑ\82еÑ\81Ñ\8f Ð¿Ñ\80о Ð¿Ñ\96дкÑ\80еÑ\81леннÑ\8f Ñ\83 Ð·Ð¼Ñ\96нниÑ\85 â\80\94 **FastAPI** Ð°Ð²Ñ\82омаÑ\82иÑ\87но ÐºÐ¾Ð½Ð²ÐµÑ\80Ñ\82Ñ\83Ñ\94 Ñ\97Ñ\85.
\86 Ð½Ðµ Ñ\85вилÑ\8eйÑ\82еÑ\81Ñ\8f Ð¿Ñ\80о Ð¿Ñ\96дкÑ\80еÑ\81леннÑ\8f Ñ\83 Ð²Ð°Ñ\88иÑ\85 Ð·Ð¼Ñ\96нниÑ\85 â\80\94 **FastAPI** Ð¿Ð¾Ð´Ð±Ð°Ñ\94 Ð¿Ñ\80о Ñ\97Ñ\85 Ð¿ÐµÑ\80еÑ\82воÑ\80еннÑ\8f.
index 92c3e77a36fe15949ad6167c0a851759d2cef548..6848090ecce73cee1e64e6e7f0f7be49824b5bf7 100644 (file)
@@ -1,29 +1,53 @@
-# Туторіал - Посібник користувача
+# Туторіал - Посібник користувача { #tutorial-user-guide }
 
 У цьому посібнику показано, як користуватися **FastAPI** з більшістю його функцій, крок за кроком.
 
 Кожен розділ поступово надбудовується на попередні, але він структурований на окремі теми, щоб ви могли перейти безпосередньо до будь-якої конкретної, щоб вирішити ваші конкретні потреби API.
 
\92Ñ\96н Ñ\82акож Ñ\81Ñ\82воÑ\80ений Ñ\8fк Ð´Ð¾Ð²Ñ\96дник Ð´Ð»Ñ\8f Ñ\80обоÑ\82и Ñ\83 Ð¼Ð°Ð¹Ð±Ñ\83Ñ\82нÑ\8cомÑ\83.
¢Ð°ÐºÐ¾Ð¶ Ð²Ñ\96н Ñ\81Ñ\82воÑ\80ений Ñ\8fк Ð´Ð¾Ð²Ñ\96дник Ð´Ð»Ñ\8f Ñ\80обоÑ\82и Ñ\83 Ð¼Ð°Ð¹Ð±Ñ\83Ñ\82нÑ\8cомÑ\83, Ñ\82ож Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð²ÐµÑ\80нÑ\83Ñ\82иÑ\81Ñ\8f Ñ\96 Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и Ñ\81аме Ñ\82е, Ñ\89о Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно.
 
-Тож ви можете повернутися і побачити саме те, що вам потрібно.
-
-## Запустіть код
+## Запустіть код { #run-the-code }
 
 Усі блоки коду можна скопіювати та використовувати безпосередньо (це фактично перевірені файли Python).
 
-Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py` і запустіть `uvicorn` за допомогою:
+Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py` і запустіть `fastapi dev` за допомогою:
 
 <div class="termy">
 
 ```console
-$ uvicorn main:app --reload
+$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+
+  <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span>  Starting development server 🚀
+
+             Searching for package file structure from directories
+             with <font color="#3465A4">__init__.py</font> files
+             Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
+
+   <span style="background-color:#007166"><font color="#D3D7CF"> module </font></span>  🐍 main.py
+
+     <span style="background-color:#007166"><font color="#D3D7CF"> code </font></span>  Importing the FastAPI app object from the module with
+             the following code:
+
+             <u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
+
+      <span style="background-color:#007166"><font color="#D3D7CF"> app </font></span>  Using import string: <font color="#3465A4">main:app</font>
+
+   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
+   <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span>  Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
+
+      <span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span>  Running in development mode, for production use:
+             <b>fastapi run</b>
 
-<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
-<span style="color: green;">INFO</span>:     Started reloader process [28720]
-<span style="color: green;">INFO</span>:     Started server process [28722]
-<span style="color: green;">INFO</span>:     Waiting for application startup.
-<span style="color: green;">INFO</span>:     Application startup complete.
+             Logs:
+
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Will watch for changes in these directories:
+             <b>[</b><font color="#4E9A06">&apos;/home/user/code/awesomeapp&apos;</font><b>]</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C
+             to quit<b>)</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Waiting for application startup.
+     <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span>  Application startup complete.
 ```
 
 </div>
@@ -34,45 +58,33 @@ $ uvicorn main:app --reload
 
 ---
 
-## Встановлення FastAPI
+## Встановлення FastAPI { #install-fastapi }
 
 Першим кроком є встановлення FastAPI.
 
\94лÑ\8f Ñ\82Ñ\83Ñ\82оÑ\80Ñ\96алÑ\83 Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\81Ñ\82ановиÑ\82и Ð¹Ð¾Ð³Ð¾ Ð· Ñ\83Ñ\81Ñ\96ма Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковими Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82Ñ\8fми Ñ\82а Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8fми:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²Ð¸ Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м **вÑ\81Ñ\82ановÑ\96Ñ\82Ñ\8c FastAPI**:
 
 <div class="termy">
 
 ```console
-$ pip install "fastapi[all]"
+$ pip install "fastapi[standard]"
 
 ---> 100%
 ```
 
 </div>
 
-...який також включає `uvicorn`, який ви можете використовувати як сервер, який запускає ваш код.
-
-/// note
-
-Ви також можете встановити його частина за частиною.
+/// note | Примітка
 
¦Ðµ Ñ\82е, Ñ\89о Ð²Ð¸, Ð¹Ð¼Ð¾Ð²Ñ\96Ñ\80но, Ð·Ñ\80обили Ð±, ÐºÐ¾Ð»Ð¸ Ð·Ð°Ñ\85оÑ\87еÑ\82е Ñ\80озгоÑ\80нÑ\83Ñ\82и Ñ\81воÑ\8e Ð¿Ñ\80огÑ\80амÑ\83 Ñ\83 Ð²Ð¸Ñ\80обниÑ\87омÑ\83 Ñ\81еÑ\80едовиÑ\89Ñ\96:
\9aоли Ð²Ð¸ Ð²Ñ\81Ñ\82ановлÑ\8eÑ\94Ñ\82е Ñ\87еÑ\80ез `pip install "fastapi[standard]"`, Ð²Ñ\96н Ð¿Ð¾Ñ\81Ñ\82аÑ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð· Ð´ÐµÑ\8fкими Ñ\82иповими Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковими Ñ\81Ñ\82андаÑ\80Ñ\82ними Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82Ñ\8fми, Ð²ÐºÐ»Ñ\8eÑ\87но Ð· `fastapi-cloud-cli`, Ñ\8fкий Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94 Ñ\80озгоÑ\80Ñ\82аÑ\82и Ð² <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
 
-```
-pip install fastapi
-```
-
-Також встановіть `uvicorn`, щоб він працював як сервер:
-
-```
-pip install "uvicorn[standard]"
-```
+Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`.
 
\86 Ñ\82е Ñ\81аме Ð´Ð»Ñ\8f ÐºÐ¾Ð¶Ð½Ð¾Ñ\97 Ð· Ð¾Ð¿Ñ\86Ñ\96оналÑ\8cниÑ\85 Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82ей, Ñ\8fкÑ\96 Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и.
¯ÐºÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð²Ñ\81Ñ\82ановиÑ\82и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñ\81Ñ\82Ñ\96, Ð°Ð»Ðµ Ð±ÐµÐ· `fastapi-cloud-cli`, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\81Ñ\82ановиÑ\82и Ñ\87еÑ\80ез `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.
 
 ///
 
-## Розширений посібник користувача
+## Розширений посібник користувача { #advanced-user-guide }
 
 Існує також **Розширений посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**.
 
@@ -80,4 +92,4 @@ pip install "uvicorn[standard]"
 
 Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте).
 
-Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Розширеного посібника користувача** .
+Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Розширеного посібника користувача**.
index 64e667ec69fa02286328b76778a0ca53ef73a4dc..cf1704562863baff06bf47d5a02c2070baef4fb9 100644 (file)
@@ -1,26 +1,26 @@
-# Метадані та URL-адреси документації
+# Метадані та URL-адреси документації { #metadata-and-docs-urls }
 
 Ви можете налаштувати кілька конфігурацій метаданих у Вашому додатку **FastAPI**.
 
-## Метадані для API
+## Метадані для API { #metadata-for-api }
 
 Ви можете встановити такі поля, які використовуються в специфікації OpenAPI та в автоматично згенерованих інтерфейсах документації API:
 
 | Параметр | Тип | Опис |
 |------------|------|-------------|
 | `title` | `str` | Назва API. |
-| `summary` | `str` | Ð\9aоÑ\80оÑ\82кий Ð¾Ð¿Ð¸Ñ\81 API. <small>Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
-| `description` | `str` | Ð\91Ñ\96лÑ\8cÑ\88 Ð´ÐµÑ\82алÑ\8cний опис API. Може використовувати Markdown. |
+| `summary` | `str` | Ð\9aоÑ\80оÑ\82кий Ð¿Ñ\96дÑ\81Ñ\83мок API. <small>Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
+| `description` | `str` | Ð\9aоÑ\80оÑ\82кий опис API. Може використовувати Markdown. |
 | `version` | `string` | Версія API. Це версія Вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
-| `terms_of_service` | `str` |  URL до умов використання API. Якщо вказано, має бути у форматі URL. |
-| `contact` | `dict` | Інформація для контакту з API. Може містити кілька полів. <details><summary><code>contact</code> поля</summary><table><thead><tr><th>Параметр</th><th>Тип</th><th>Опис</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>Ім'я контактної особи або організації.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL з інформацією для контакту. Повинен бути у форматі URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>Email контактної особи або організації. Повинен бути у форматі електронної пошти.</td></tr></tbody></table></details> |
-| `license_info` | `dict` | Інформація про ліцензію для API. Може містити кілька полів. <details><summary><code>license_info</code> поля</summary><table><thead><tr><th>Параметр</th><th>Тип</th><th>Опис</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ОБОВ'ЯЗКОВО</strong> (якщо встановлено <code>license_info</code>). Назва ліцензії для API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Ліцензійний вираз за <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> для API. Поле <code>identifier</code> взаємовиключне з полем <code>url</code>. <small>Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL до ліцензії, яка використовується для API. Повинен бути у форматі URL.</td></tr></tbody></table></details> |
+| `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. |
+| `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів. <details><summary><code>contact</code> поля</summary><table><thead><tr><th>Параметр</th><th>Тип</th><th>Опис</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>Ідентифікаційне ім'я контактної особи або організації.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL, що вказує на контактну інформацію. <strong>МАЄ</strong> бути у форматі URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>Адреса електронної пошти контактної особи або організації. <strong>МАЄ</strong> бути у форматі адреси електронної пошти.</td></tr></tbody></table></details> |
+| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів. <details><summary><code>license_info</code> поля</summary><table><thead><tr><th>Параметр</th><th>Тип</th><th>Опис</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>ОБОВ'ЯЗКОВО</strong> (якщо встановлено <code>license_info</code>). Назва ліцензії для API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Ліцензійний вираз за <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> для API. Поле <code>identifier</code> взаємовиключне з полем <code>url</code>. <small>Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>URL до ліцензії, яка використовується для API. <strong>МАЄ</strong> бути у форматі URL.</td></tr></tbody></table></details> |
 
 Ви можете налаштувати їх наступним чином:
 
-{* ../../docs_src/metadata/tutorial001.py hl[3:16, 19:32] *}
+{* ../../docs_src/metadata/tutorial001_py39.py hl[3:16, 19:32] *}
 
-/// tip | Підказка
+/// tip | Порада
 
 У полі `description` можна використовувати Markdown, і він буде відображатися у результаті.
 
 
 <img src="/img/tutorial/metadata/image01.png">
 
-## Ідентифікатор ліцензії
+## Ідентифікатор ліцензії { #license-identifier }
 
 З початку використання OpenAPI 3.1.0 та FastAPI 0.99.0 Ви також можете налаштувати `license_info` за допомогою `identifier` замість `url`.
 
 Наприклад:
 
-{* ../../docs_src/metadata/tutorial001_1.py hl[31] *}
+{* ../../docs_src/metadata/tutorial001_1_py39.py hl[31] *}
 
-## Метадані для тегів
+## Метадані для тегів { #metadata-for-tags }
 
 Ви також можете додати додаткові метадані для різних тегів, які використовуються для групування операцій шляхів, за допомогою параметра `openapi_tags`.
 
 
 Кожен словник може містити:
 
-* `name` (**обов'язково**): `str` з тією ж назвою тегу, яку Ви використовуєте у параметрі  `tags` у Ваших *операціях шляху* та `APIRouter`s.
-* `description`: `str` Ð· ÐºÐ¾Ñ\80оÑ\82ким Ð¾Ð¿Ð¸Ñ\81ом Ñ\82егÑ\83. Ð\9cоже Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Markdown Ñ\96 Ð±Ñ\83де Ð²Ñ\96добÑ\80ажено в інтерфейсі документації.
-* `externalDocs`: `dict` який описує зовнішню документацію з такими полями:
+* `name` (**обов'язково**): `str` з тією ж назвою тегу, яку Ви використовуєте у параметрі `tags` у Ваших *операціях шляху* та `APIRouter`s.
+* `description`: `str` Ð· ÐºÐ¾Ñ\80оÑ\82ким Ð¾Ð¿Ð¸Ñ\81ом Ñ\82егÑ\83. Ð\9cоже Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Markdown Ñ\96 Ð±Ñ\83де Ð¿Ð¾ÐºÐ°Ð·Ð°но в інтерфейсі документації.
+* `externalDocs`: `dict`, який описує зовнішню документацію з такими полями:
     * `description`: `str` з коротким описом зовнішньої документації.
-    * `url` (**обов'язково**): `str`з URL-адресою зовнішньої документації.
+    * `url` (**обов'язково**): `str` з URL-адресою зовнішньої документації.
 
-### Створення метаданих для тегів
+### Створення метаданих для тегів { #create-metadata-for-tags }
 
 Спробуймо це на прикладі з тегами для `users` та `items`.
 
-Створіть метадані для своїх тегів і передайте їх у параметр  `openapi_tags`:
+Створіть метадані для своїх тегів і передайте їх у параметр `openapi_tags`:
 
-{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *}
+{* ../../docs_src/metadata/tutorial004_py39.py hl[3:16,18] *}
 
 Зверніть увагу, що в описах можна використовувати Markdown, наприклад, "login" буде показано жирним шрифтом (**login**), а "fancy" буде показано курсивом (_fancy_).
 
 /// tip | Порада
 
\9dе Ð¾Ð±Ð¾Ð²'Ñ\8fзково додавати метадані для всіх тегів, які Ви використовуєте.
\92ам Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно додавати метадані для всіх тегів, які Ви використовуєте.
 
 ///
 
-### Ð\92икоÑ\80иÑ\81Ñ\82аннÑ\8f Ñ\82егÑ\96в
+### Ð\92икоÑ\80иÑ\81Ñ\82овÑ\83йÑ\82е Ñ\81воÑ\97 Ñ\82еги { #use-your-tags }
 
-Використовуйте параметр `tags` зі своїми *операціями шляху* (і `APIRouter`) для призначення їх до різних тегів:
+Використовуйте параметр `tags` зі своїми *операціями шляху* (і `APIRouter`s), щоб призначити їх до різних тегів:
 
-{* ../../docs_src/metadata/tutorial004.py hl[21,26] *}
+{* ../../docs_src/metadata/tutorial004_py39.py hl[21,26] *}
 
 /// info | Інформація
 
-Детальніше про теги читайте в розділі [Конфігурація шляхів операцій](path-operation-configuration.md#tags){.internal-link target=_blank}.
+Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags){.internal-link target=_blank}.
 
 ///
 
-### Перевірка документації
+### Перевірте документацію { #check-the-docs }
 
¯ÐºÑ\89о Ð\92и Ð·Ð°Ñ\80аз перевірите документацію, вона покаже всі додаткові метадані:
¢ÐµÐ¿ÐµÑ\80, Ñ\8fкÑ\89о Ð\92и перевірите документацію, вона покаже всі додаткові метадані:
 
 <img src="/img/tutorial/metadata/image02.png">
 
-### Порядок тегів
+### Порядок тегів { #order-of-tags }
 
 Порядок кожного словника метаданих тегу також визначає порядок відображення в інтерфейсі документації.
 
-Наприклад, хоча `users` мав би йти після `items` в алфавітному порядку, він відображається перед ними, оскільки ми додали його метадані як перший словник у списку.
+Наприклад, хоча `users` мав би йти після `items` в алфавітному порядку, він відображається перед ними, оскільки ми додали їхні метадані як перший словник у списку.
 
-## URL для OpenAPI
+## URL для OpenAPI { #openapi-url }
 
 За замовчуванням схема OpenAPI надається за адресою `/openapi.json`.
 
 
 Наприклад, щоб налаштувати його на `/api/v1/openapi.json`:
 
-{* ../../docs_src/metadata/tutorial002.py hl[3] *}
+{* ../../docs_src/metadata/tutorial002_py39.py hl[3] *}
 
 Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
 
-## URL-адреси документації
+## URL-адреси документації { #docs-urls }
 
 Ви можете налаштувати два інтерфейси користувача для документації, які включені:
 
 
 Наприклад, щоб налаштувати Swagger UI на `/documentation` і вимкнути ReDoc:
 
-{* ../../docs_src/metadata/tutorial003.py hl[3] *}
+{* ../../docs_src/metadata/tutorial003_py39.py hl[3] *}
index 13ce8573dee9f01dae00c719326e65e77761fe29..2d1580e49e5df003e506256c2a4416b9b7aa6d42 100644 (file)
@@ -1,45 +1,43 @@
-# Middleware (Проміжний шар)
+# Middleware { #middleware }
 
-У **FastAPI** можна додавати middleware (проміжний шар).
+У **FastAPI** можна додавати middleware.
 
-"Middleware" — це функція, яка працює з кожним **запитом** перед його обробкою будь-якою конкретною *операцією шляху* (*path operation*), а також з кожною **відповіддю** перед її поверненням.
+«Middleware» — це функція, яка працює з кожним **запитом** перед його обробкою будь-якою конкретною *операцією шляху*. А також з кожною **відповіддю** перед її поверненням.
 
-* Middleware отримує кожен **запит**, що надходить до Вашого застосунку.
-* Ð\9cоже виконати певні дії із цим **запитом** або запустити необхідний код.
-* Ð\94алÑ\96 Ð¿ÐµÑ\80едаÑ\94 **запиÑ\82** Ð´Ð»Ñ\8f Ð¾Ð±Ñ\80обки Ð¾Ñ\81новним Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нком (*операцією шляху*).
-* Ð\9eÑ\82Ñ\80имÑ\83Ñ\94 **вÑ\96дповÑ\96дÑ\8c**, Ñ\81Ñ\84оÑ\80мованÑ\83 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нком (*операцією шляху*).
-* Ð\9cоже Ð·Ð¼Ñ\96ниÑ\82и Ñ\86Ñ\8e **вÑ\96дповÑ\96дÑ\8c** Ð°Ð±Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð´Ð¾Ð´Ð°Ñ\82ковий код.
-* Повертає **відповідь** клієнту.
+* Вона отримує кожен **запит**, що надходить до вашого застосунку.
+* Ð\9fоÑ\82Ñ\96м Ð²Ð¾Ð½Ð° Ð¼оже виконати певні дії із цим **запитом** або запустити необхідний код.
+* Ð\94алÑ\96 Ð²Ð¾Ð½Ð° Ð¿ÐµÑ\80едаÑ\94 **запиÑ\82** Ð´Ð»Ñ\8f Ð¾Ð±Ñ\80обки Ñ\80еÑ\88Ñ\82оÑ\8e Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нкÑ\83 (Ñ\8fкоÑ\8eÑ\81Ñ\8c *операцією шляху*).
+* Ð\9fоÑ\82Ñ\96м Ð²Ð¾Ð½Ð° Ð¾Ñ\82Ñ\80имÑ\83Ñ\94 **вÑ\96дповÑ\96дÑ\8c**, Ñ\81Ñ\84оÑ\80мованÑ\83 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нком (Ñ\8fкоÑ\8eÑ\81Ñ\8c *операцією шляху*).
+* Ð\92она Ð¼Ð¾Ð¶Ðµ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð¿ÐµÐ²Ð½Ñ\96 Ð´Ñ\96Ñ\97 Ñ\96з Ñ\86Ñ\96Ñ\94Ñ\8e **вÑ\96дповÑ\96ддÑ\8e** Ð°Ð±Ð¾ Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дний код.
+* Потім вона повертає **відповідь**.
 
 /// note | Технічні деталі
 
-ЯкÑ\89о Ñ\83 Ð\92ас є залежності з `yield`, код виходу виконається *після* middleware.
+ЯкÑ\89о Ñ\83 Ð²ас є залежності з `yield`, код виходу виконається *після* middleware.
 
-Якщо були заплановані фонові задачі (background tasks - розглянуто далі), вони виконаються *після* всіх middleware.
+Якщо були заплановані фонові задачі (розглянуто в розділі [Background Tasks](background-tasks.md){.internal-link target=_blank}, ви побачите це пізніше), вони виконаються *після* всіх middleware.
 
 ///
 
-## Створення middleware
+## Створення middleware { #create-a-middleware }
 
-Щоб Ñ\81Ñ\82воÑ\80иÑ\82и middleware, Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Ð´ÐµÐºÐ¾Ñ\80аÑ\82оÑ\80 `@app.middleware("http")` Ð½Ð° Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97.
+Щоб Ñ\81Ñ\82воÑ\80иÑ\82и middleware, Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Ð´ÐµÐºÐ¾Ñ\80аÑ\82оÑ\80 `@app.middleware("http")` Ð½Ð°Ð´ Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\94Ñ\8e.
 
 Функція middleware отримує:
 
-* `Запит`.
-* Функцію `call_next`, яка приймає `запит` як параметр.
-    * Ця функція передає `запит` відповідній *операції шляху*.
-    * Потім вона повертає `відповідь`, згенеровану цією *операцією шляху*.
+* `request`.
+* Функцію `call_next`, яка отримає `request` як параметр.
+    * Ця функція передасть `request` відповідній *операції шляху*.
+    * Потім вона поверне `response`, згенеровану відповідною *операцією шляху*.
+* Потім ви можете додатково змінити `response` перед тим, як повернути її.
 
-* Ви можете ще змінити `відповідь` перед тим, як повернути її.
-
-
-{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
+{* ../../docs_src/middleware/tutorial001_py39.py hl[8:9,11,14] *}
 
 /// tip | Порада
 
\9dе Ð·Ð°Ð±Ñ\83вайÑ\82е, Ñ\89о Ð²Ð»Ð°Ñ\81нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Ð¼Ð¾Ð¶Ð½Ð° Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">пÑ\80еÑ\84Ñ\96кÑ\81 'X-'</a>.
\9fамâ\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о Ð²Ð»Ð°Ñ\81нÑ\96 Ð¿Ñ\80опÑ\80Ñ\96Ñ\94Ñ\82аÑ\80нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Ð¼Ð¾Ð¶Ð½Ð° Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82и <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">викоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ð¿Ñ\80еÑ\84Ñ\96кÑ\81 `X-`</a>.
 
\90ле Ñ\8fкÑ\89о Ñ\83 Ð\92аÑ\81 Ñ\94 Ð²Ð»Ð°Ñ\81нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, Ñ\8fкÑ\96 Ð\92и Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð±Ñ\80аÑ\83зеÑ\80ний ÐºÐ»Ñ\96Ñ\94нÑ\82 Ð¼Ñ\96г Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и, Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ð´Ð¾ Ð\92аÑ\88оÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 CORS (див. [CORS (Ð\9eбмÑ\96н Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81ами Ð¼Ñ\96ж Ñ\80Ñ\96зними Ð´Ð¶ÐµÑ\80елами)](cors.md){.internal-link target=_blank} за допомогою параметра `expose_headers`, описаного в <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">документації Starlette по CORS</a>.
\90ле Ñ\8fкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ð²Ð»Ð°Ñ\81нÑ\96 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, Ñ\8fкÑ\96 Ð²Ð¸ Ñ\85оÑ\87еÑ\82е, Ñ\89об ÐºÐ»Ñ\96Ñ\94нÑ\82 Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96 Ð¼Ñ\96г Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и, Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ð´Ð¾ Ð²Ð°Ñ\88иÑ\85 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96й CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) за допомогою параметра `expose_headers`, описаного в <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">документації Starlette по CORS</a>.
 
 ///
 
 
 Ви також можете використати `from starlette.requests import Request`.
 
-**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ñ\86е Ð´Ð»Ñ\8f Ð\92аÑ\88оÑ\97 Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96 Ñ\8fк Ñ\80озÑ\80обника. Ð\90ле Ð²Ñ\96н походить безпосередньо зі Starlette.
+**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ñ\86е Ð´Ð»Ñ\8f Ð²Ð°Ñ\88оÑ\97 Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96 Ñ\8fк Ñ\80озÑ\80обника. Ð\90ле Ð²Ð¾Ð½Ð¾ походить безпосередньо зі Starlette.
 
 ///
 
-### До і після `response`(`відповіді`)
+### До і після `response` { #before-and-after-the-response }
 
-Ви можете додати код, який буде виконуватися з `запитом` (`request`), до того, як його обробить будь-яка *операція шляху* (*path operation*).
+Ви можете додати код, який буде виконуватися з `request`, до того, як його отримає будь-яка *операція шляху*.
 
-Також Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и ÐºÐ¾Ð´, Ñ\8fкий Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82иÑ\81Ñ\8f Ð¿Ñ\96Ñ\81лÑ\8f Ñ\82ого, Ñ\8fк `вÑ\96дповÑ\96дÑ\8c` (`response`) Ð±Ñ\83де Ð·Ð³ÐµÐ½ÐµÑ\80овано, Ð¿ÐµÑ\80ед Ñ\82им Ñ\8fк Ð¹Ð¾Ð³Ð¾ повернути.
+Також Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и ÐºÐ¾Ð´, Ñ\8fкий Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82иÑ\81Ñ\8f Ð¿Ñ\96Ñ\81лÑ\8f Ñ\82ого, Ñ\8fк `response` Ð±Ñ\83де Ð·Ð³ÐµÐ½ÐµÑ\80овано, Ð¿ÐµÑ\80ед Ñ\82им Ñ\8fк Ñ\97Ñ\97 повернути.
 
\9dапÑ\80иклад, Ð\92и можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
\9dапÑ\80иклад, Ð²и можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
 
-{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
+{* ../../docs_src/middleware/tutorial001_py39.py hl[10,12:13] *}
 
-
-/// tip | Підказка
+/// tip | Порада
 
 Тут ми використовуємо <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
 
 ///
 
-## Інші middlewares
+## Порядок виконання кількох middleware { #multiple-middleware-execution-order }
+
+Коли ви додаєте кілька middleware, використовуючи або декоратор `@app.middleware()` або метод `app.add_middleware()`, кожен новий middleware обгортає застосунок, утворюючи стек. Останній доданий middleware є *зовнішнім*, а перший — *внутрішнім*.
+
+На шляху запиту першим виконується *зовнішній* middleware.
+
+На шляху відповіді він виконується останнім.
+
+Наприклад:
+
+```Python
+app.add_middleware(MiddlewareA)
+app.add_middleware(MiddlewareB)
+```
+
+Це призводить до такого порядку виконання:
+
+* **Запит**: MiddlewareB → MiddlewareA → route
+
+* **Відповідь**: route → MiddlewareA → MiddlewareB
+
+Така поведінка стеку гарантує, що middleware виконуються у передбачуваному та керованому порядку.
+
+## Інші middlewares { #other-middlewares }
 
 Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
 
index 8ee4f480fec5aed5deccd240817ec8a4d73910cb..f6aa9201930fd692cce1e50579a8105a91e63848 100644 (file)
@@ -1,8 +1,8 @@
-# Path Параметри та валідація числових даних
+# Параметри шляху та валідація числових даних { #path-parameters-and-numeric-validations }
 
-Так Ñ\81амо Ñ\8fк Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¿ÐµÑ\80евÑ\96Ñ\80ки Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ð´Ð»Ñ\8f query Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, Ð\92и можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`.
+Так Ñ\81амо Ñ\8fк Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¿ÐµÑ\80евÑ\96Ñ\80ки Ñ\82а Ð¼ÐµÑ\82аданÑ\96 Ð´Ð»Ñ\8f query Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, Ð²и можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`.
 
-## Імпорт Path
+## Імпорт `Path` { #import-path }
 
 Спочатку імпортуйте `Path` з `fastapi` і імпортуйте `Annotated`:
 
 
 /// info | Інформація
 
-FastAPI додав підтримку `Annotated`  (і почав рекомендувати його використання) у версії 0.95.0.
+FastAPI додав підтримку `Annotated` (і почав рекомендувати його використання) у версії 0.95.0.
 
-ЯкÑ\89о Ñ\83 Ð\92ас стара версія, при спробі використати `Annotated` можуть виникати помилки.
+ЯкÑ\89о Ñ\83 Ð²ас стара версія, при спробі використати `Annotated` можуть виникати помилки.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`.
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²и [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`.
 
 ///
 
-## Оголошення метаданих
+## Оголошення метаданих { #declare-metadata }
 
 Ви можете оголошувати всі ті ж параметри, що і для `Query`.
 
\9dапÑ\80иклад, Ñ\89об Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f Ð¼ÐµÑ\82аданиÑ\85 `title` Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id`, Ð\92и можете написати:
\9dапÑ\80иклад, Ñ\89об Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f Ð¼ÐµÑ\82аданиÑ\85 `title` Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id`, Ð²и можете написати:
 
 {* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *}
 
 /// note | Примітка
 
\9fаÑ\80амеÑ\82Ñ\80 Ñ\88лÑ\8fÑ\85Ñ\83 Ð·Ð°Ð²Ð¶Ð´Ð¸ Ñ\94 Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ñ\96н Ð¼Ð°Ñ\94 Ð±Ñ\83Ñ\82и Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\88лÑ\8fÑ\85Ñ\83. Ð\9dавÑ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82е Ð¹Ð¾Ð³Ð¾ Ð·Ñ\96 Ð·Ð½Ð°Ñ\87еннÑ\8fм `None` Ð°Ð±Ð¾ Ð²Ñ\81Ñ\82ановиÑ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм â\80\94 Ð²Ñ\96н Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð·Ð°Ð»Ð¸Ñ\88аÑ\82имеÑ\82Ñ\8cÑ\81Ñ\8f обов’язковим.
\9fаÑ\80амеÑ\82Ñ\80 Ñ\88лÑ\8fÑ\85Ñ\83 Ð·Ð°Ð²Ð¶Ð´Ð¸ Ñ\94 Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ñ\96н Ð¼Ð°Ñ\94 Ð±Ñ\83Ñ\82и Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\88лÑ\8fÑ\85Ñ\83. Ð\9dавÑ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82е Ð¹Ð¾Ð³Ð¾ Ð·Ñ\96 Ð·Ð½Ð°Ñ\87еннÑ\8fм `None` Ð°Ð±Ð¾ Ð²Ñ\81Ñ\82ановиÑ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм â\80\94 Ñ\86е Ð½Ñ\96 Ð½Ð° Ñ\89о Ð½Ðµ Ð²Ð¿Ð»Ð¸Ð½Ðµ, Ð²Ñ\96н Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð·Ð°Ð²Ð¶Ð´Ð¸ Ð±Ñ\83де обов’язковим.
 
 ///
 
-## Ð£Ð¿Ð¾Ñ\80Ñ\8fдковÑ\83йÑ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и, Ñ\8fк Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно
+## Ð£Ð¿Ð¾Ñ\80Ñ\8fдковÑ\83йÑ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и, Ñ\8fк Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно { #order-the-parameters-as-you-need }
 
-/// tip | Підказка
+/// tip | Порада
 
-Це, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\96лÑ\8cки Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¾ Ð°Ð±Ð¾ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дно, Ñ\8fкÑ\89о Ð\92и використовуєте `Annotated`.
+Це, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\96лÑ\8cки Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¾ Ð°Ð±Ð¾ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дно, Ñ\8fкÑ\89о Ð²и використовуєте `Annotated`.
 
 ///
 
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ð\92и Ñ\85оÑ\87еÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 `q`  як обов’язковий `str`.
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 `q` як обов’язковий `str`.
 
\86 Ð\92ам Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð½Ñ\96Ñ\87ого Ñ\96нÑ\88ого Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð¿Ð°Ñ\80амеÑ\82Ñ\80а, Ñ\82омÑ\83 Ð½ÐµÐ¼Ð°Ñ\94 Ð¿Ð¾Ñ\82Ñ\80еби використовувати `Query`.
\86 Ð²Ð°Ð¼ Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð½Ñ\96Ñ\87ого Ñ\96нÑ\88ого Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ð¿Ð°Ñ\80амеÑ\82Ñ\80а, Ñ\82омÑ\83 Ð²Ð°Ð¼ Ð½Ð°Ñ\81пÑ\80авдÑ\96 Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно використовувати `Query`.
 
\90ле Ð\92ам Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `Path` Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id`. Ð\86 Ð· Ð¿ÐµÐ²Ð½Ð¸Ñ\85 Ð¿Ñ\80иÑ\87ин Ð\92и не хочете використовувати `Annotated`.
\90ле Ð²Ð°Ð¼ Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `Path` Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id`. Ð\86 Ð· Ð¿ÐµÐ²Ð½Ð¸Ñ\85 Ð¿Ñ\80иÑ\87ин Ð²и не хочете використовувати `Annotated`.
 
 Python видасть помилку, якщо розмістити значення з "default" перед значенням, яке не має "default".
 
\90ле Ð\92и можете змінити порядок і розмістити значення без значення за замовчуванням (параметр запиту `q`) першим.
\90ле Ð²и можете змінити порядок і розмістити значення без значення за замовчуванням (параметр запиту `q`) першим.
 
+Для **FastAPI** порядок не має значення. Він визначає параметри за їхніми іменами, типами та оголошеннями за замовчуванням (`Query`, `Path` тощо) і не звертає уваги на порядок.
 
\94лÑ\8f **FastAPI** Ð¿Ð¾Ñ\80Ñ\8fдок Ð½Ðµ Ð¼Ð°Ñ\94 Ð·Ð½Ð°Ñ\87еннÑ\8f. Ð\92Ñ\96н Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð·Ð° Ñ\97Ñ\85 Ñ\96менами, Ñ\82ипами Ñ\82а Ð·Ð½Ð°Ñ\87еннÑ\8fми Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм (`Query`, `Path` Ñ\82оÑ\89о) Ñ\96 Ð½Ðµ Ð·Ð²ÐµÑ\80Ñ\82аÑ\94 Ñ\83ваги Ð½Ð° Ð¿Ð¾Ñ\80Ñ\8fдок.
¢Ð¾Ð¼Ñ\83 Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð²Ð°Ñ\88Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e Ñ\82ак:
 
-Тому Ви можете оголосити Вашу функцію так:
+{* ../../docs_src/path_params_numeric_validations/tutorial002_py39.py hl[7] *}
 
-{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *}
-
-Але майте на увазі, що якщо Ви використовуєте `Annotated`, ця проблема не виникне, оскільки Ви не використовуєте значення за замовчуванням для параметрів `Query()` або `Path()`.
+Але майте на увазі, що якщо ви використовуєте `Annotated`, цієї проблеми не буде, це не матиме значення, оскільки ви не використовуєте значення за замовчуванням параметрів функції для `Query()` або `Path()`.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
 
-## Упорядковуйте параметри за потребою, хитрощі
+## Упорядковуйте параметри, як вам потрібно: хитрощі { #order-the-parameters-as-you-need-tricks }
 
-/// tip | Підказка
+/// tip | Порада
 
-Це, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\96лÑ\8cки Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¾ Ð°Ð±Ð¾ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дно, Ñ\8fкÑ\89о Ð\92и використовуєте `Annotated`.
+Це, Ð¼Ð°Ð±Ñ\83Ñ\82Ñ\8c, Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\96лÑ\8cки Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¾ Ð°Ð±Ð¾ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дно, Ñ\8fкÑ\89о Ð²и використовуєте `Annotated`.
 
 ///
 
 Ось **невелика хитрість**, яка може стати в пригоді, хоча вона рідко знадобиться.
 
-ЯкÑ\89о Ð\92и хочете:
+ЯкÑ\89о Ð²и хочете:
 
-* оголосити параметр запиту `q`  без використання `Query` або значення за замовчуванням
+* оголосити параметр запиту `q` без `Query` і без жодного значення за замовчуванням
 * оголосити параметр шляху `item_id`, використовуючи `Path`
 * розмістити їх у різному порядку
 * не використовувати `Annotated`
@@ -84,72 +83,72 @@ Python видасть помилку, якщо розмістити значен
 
 Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Навіть якщо вони не мають значення за замовчуванням.
 
-{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial003_py39.py hl[7] *}
 
-### Краще з `Annotated`
+### Краще з `Annotated` { #better-with-annotated }
 
\9cайÑ\82е Ð½Ð° Ñ\83вазÑ\96, Ñ\8fкÑ\89о Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `Annotated`, Ð¾Ñ\81кÑ\96лÑ\8cки Ð\92и Ð½Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\86Ñ\96Ñ\94Ñ\97 Ð¿Ñ\80облеми Ð½Ðµ Ð²Ð¸Ð½Ð¸ÐºÐ½Ðµ, Ñ\96, Ñ\88видÑ\88е Ð·Ð° Ð²Ñ\81е, Ð\92ам не потрібно буде використовувати `*`.
\9cайÑ\82е Ð½Ð° Ñ\83вазÑ\96, Ñ\89о Ñ\8fкÑ\89о Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `Annotated`, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ð¸ Ð½Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\86Ñ\96Ñ\94Ñ\97 Ð¿Ñ\80облеми Ð½Ðµ Ð±Ñ\83де, Ñ\96, Ð¹Ð¼Ð¾Ð²Ñ\96Ñ\80но, Ð²ам не потрібно буде використовувати `*`.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
 
-## Валідація числових даних: більше або дорівнює
+## Валідація числових даних: більше або дорівнює { #number-validations-greater-than-or-equal }
 
\97а Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query` Ñ\96 `Path` (Ñ\82а Ñ\96нÑ\88иÑ\85, Ñ\8fкÑ\96 Ð\92и побачите пізніше) можна оголошувати числові обмеження.
\97а Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query` Ñ\96 `Path` (Ñ\82а Ñ\96нÑ\88иÑ\85, Ñ\8fкÑ\96 Ð²и побачите пізніше) можна оголошувати числові обмеження.
 
 Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
 
-## Валідація числових даних: більше ніж і менше або дорівнює
+## Валідація числових даних: більше ніж і менше або дорівнює { #number-validations-greater-than-and-less-than-or-equal }
 
 Те саме застосовується до:
 
-* `gt`: `g`reater `t`han (більше ніж)
-* `le`: `l`ess than or `e`qual (менше або дорівнює)
+* `gt`: `g`reater `t`han
+* `le`: `l`ess than or `e`qual
 
 {* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
 
-## Валідація числових даних: float, більше ніж і менше ніж
+## Валідація числових даних: float, більше ніж і менше ніж { #number-validations-floats-greater-than-and-less-than }
 
 Валідація чисел також працює для значень типу `float`.
 
-Ось де стає важливо мати можливість оголошувати <abbr title="greater than (більше ніж)"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal (більше або дорівнює)"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
+Ось де стає важливо мати можливість оголошувати <abbr title="greater than"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
 
 Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні.
 
-Те саме стосується <abbr title="less than (менше ніж)"><code>lt</code></abbr>.
+Те саме стосується <abbr title="less than"><code>lt</code></abbr>.
 
 {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
 
-## Підсумок
+## Підсумок { #recap }
 
\97а Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, `Path` (Ñ\96 Ñ\96нÑ\88иÑ\85 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в, Ñ\8fкÑ\96 Ð\92и Ñ\89е Ð½Ðµ Ð±Ð°Ñ\87или) Ð¼Ð¾Ð¶Ð½Ð° Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¼ÐµÑ\82аданÑ\96 Ñ\82а Ð¿ÐµÑ\80евÑ\96Ñ\80ки Ñ\80Ñ\8fдкÑ\96в, так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}.
\97а Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, `Path` (Ñ\96 Ñ\96нÑ\88иÑ\85 Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в, Ñ\8fкÑ\96 Ð²Ð¸ Ñ\89е Ð½Ðµ Ð±Ð°Ñ\87или) Ð¼Ð¾Ð¶Ð½Ð° Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¼ÐµÑ\82аданÑ\96 Ñ\82а Ð¿ÐµÑ\80евÑ\96Ñ\80ки Ñ\80Ñ\8fдкÑ\96в так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}.
 
 Також можна оголошувати числові перевірки:
 
-* `gt`: `g`reater `t`han (більше ніж)
-* `ge`: `g`reater than or `e`qual (більше або дорівнює)
-* `lt`: `l`ess `t`han (менше ніж)
-* `le`: `l`ess than or `e`qual (менше або дорівнює)
+* `gt`: `g`reater `t`han
+* `ge`: `g`reater than or `e`qual
+* `lt`: `l`ess `t`han
+* `le`: `l`ess than or `e`qual
 
 /// info | Інформація
 
-`Query`, `Path` Ñ\82а Ñ\96нÑ\88Ñ\96 ÐºÐ»Ð°Ñ\81и, Ñ\8fкÑ\96 Ð\92и побачите пізніше, є підкласами спільного класу `Param`.
+`Query`, `Path` Ñ\82а Ñ\96нÑ\88Ñ\96 ÐºÐ»Ð°Ñ\81и, Ñ\8fкÑ\96 Ð²и побачите пізніше, є підкласами спільного класу `Param`.
 
\92Ñ\81Ñ\96 Ð²Ð¾Ð½Ð¸ Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð´Ð»Ñ\8f Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¿ÐµÑ\80евÑ\96Ñ\80ок Ñ\96 Ð¼ÐµÑ\82аданиÑ\85, Ñ\8fкÑ\96 Ð\92и вже бачили.
\92Ñ\81Ñ\96 Ð²Ð¾Ð½Ð¸ Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð´Ð»Ñ\8f Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¿ÐµÑ\80евÑ\96Ñ\80ок Ñ\96 Ð¼ÐµÑ\82аданиÑ\85, Ñ\8fкÑ\96 Ð²и вже бачили.
 
 ///
 
 /// note | Технічні деталі
 
\9aоли Ð\92и імпортуєте `Query`, `Path` та інші з `fastapi`, насправді це функції.
\9aоли Ð²и імпортуєте `Query`, `Path` та інші з `fastapi`, насправді це функції.
 
 При виклику вони повертають екземпляри класів з такими ж іменами.
 
-ТобÑ\82о Ð\92и Ñ\96мпоÑ\80Ñ\82Ñ\83Ñ\94Ñ\82е `Query`, Ñ\8fка Ñ\94 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\94Ñ\8e. Ð\90 ÐºÐ¾Ð»Ð¸ Ð\92и її викликаєте, вона повертає екземпляр класу, який теж називається `Query`.
+ТобÑ\82о Ð²Ð¸ Ñ\96мпоÑ\80Ñ\82Ñ\83Ñ\94Ñ\82е `Query`, Ñ\8fка Ñ\94 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\94Ñ\8e. Ð\90 ÐºÐ¾Ð»Ð¸ Ð²и її викликаєте, вона повертає екземпляр класу, який теж називається `Query`.
 
-ЦÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\81Ñ\82воÑ\80енÑ\96 Ñ\82аким Ñ\87ином (замÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f ÐºÐ»Ð°Ñ\81Ñ\96в Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83), Ñ\89об Ð\92аш редактор не відзначав їхні типи як помилки.
+ЦÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\81Ñ\82воÑ\80енÑ\96 Ñ\82аким Ñ\87ином (замÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f ÐºÐ»Ð°Ñ\81Ñ\96в Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83), Ñ\89об Ð²аш редактор не відзначав їхні типи як помилки.
 
-Таким Ñ\87ином, Ð\92и можете користуватися своїм звичайним редактором і інструментами для програмування без додаткових налаштувань для ігнорування таких помилок.
+Таким Ñ\87ином, Ð²и можете користуватися своїм звичайним редактором і інструментами для програмування без додаткових налаштувань для ігнорування таких помилок.
 
 ///
index da4ff2f9ead198f2167a62477a38cc9e7ade4693..05989054956191a673e93efb3738af8cb8c070f1 100644 (file)
@@ -1,34 +1,34 @@
-# Path Параметри
+# Параметри шляху { #path-parameters }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и "паÑ\80амеÑ\82Ñ\80и" Ð°Ð±Ð¾ "змÑ\96ннÑ\96" Ñ\88лÑ\8fÑ\85Ñ\83, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81инÑ\82акÑ\81иÑ\81 Ñ\84оÑ\80маÑ\82ованиÑ\85 Ñ\80Ñ\8fдкÑ\96в:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Â«Ð¿Ð°Ñ\80амеÑ\82Ñ\80и» Ð°Ð±Ð¾ Â«Ð·Ð¼Ñ\96ннÑ\96» Ñ\88лÑ\8fÑ\85Ñ\83, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\82ой Ñ\81амий Ñ\81инÑ\82акÑ\81иÑ\81, Ñ\89о Ð¹ Ñ\83 Ñ\84оÑ\80маÑ\82ованиÑ\85 Ñ\80Ñ\8fдкаÑ\85 Python:
 
-{* ../../docs_src/path_params/tutorial001.py hl[6:7] *}
+{* ../../docs_src/path_params/tutorial001_py39.py hl[6:7] *}
 
\97наÑ\87еннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id` Ð¿ÐµÑ\80едаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f у функцію як аргумент `item_id`.
\97наÑ\87еннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83 `item_id` Ð±Ñ\83де Ð¿ÐµÑ\80едано Ñ\83 Ð²Ð°Ñ\88у функцію як аргумент `item_id`.
 
¯ÐºÑ\89о Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и Ñ\86ей Ð¿Ñ\80иклад Ñ\82а Ð¿ÐµÑ\80ейÑ\82и Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, Ñ\82о Ð¾Ñ\82Ñ\80имаÑ\94мо Ñ\82акÑ\83 відповідь:
\9eÑ\82же, Ñ\8fкÑ\89о Ð²Ð¸ Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Ñ\86ей Ð¿Ñ\80иклад Ñ\96 Ð¿ÐµÑ\80ейдеÑ\82е Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, Ñ\82о Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е відповідь:
 
 ```JSON
 {"item_id":"foo"}
 ```
 
-## Path параметри з типами
+## Параметри шляху з типами { #path-parameters-with-types }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸Ð·Ð½Ð°Ñ\87ити тип параметра шляху у функції, використовуючи стандартні анотації типів Python:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81ити тип параметра шляху у функції, використовуючи стандартні анотації типів Python:
 
-{* ../../docs_src/path_params/tutorial002.py hl[7] *}
+{* ../../docs_src/path_params/tutorial002_py39.py hl[7] *}
 
-У Ñ\82акомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 `item_id` Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f як `int`.
+У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 `item_id` Ð¾Ð³Ð¾Ð»Ð¾Ñ\88ено як `int`.
 
 /// check | Примітка
 
-Це Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96Ñ\81Ñ\82Ñ\8c Ð¿Ñ\96дÑ\82Ñ\80имки Ñ\80едакÑ\82оÑ\80а Ð²Ñ\81еÑ\80единÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð· Ð¿ÐµÑ\80евÑ\96Ñ\80ками Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº, Ð°Ð²Ñ\82одоповненнÑ\8f тощо.
+Це Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð¼ Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ñ\80едакÑ\82оÑ\80а Ð²Ñ\81еÑ\80единÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð· Ð¿ÐµÑ\80евÑ\96Ñ\80ками Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº, Ð°Ð²Ñ\82одоповненнÑ\8fм тощо.
 
 ///
 
-## <abbr title="або: серіалізація, парсинг, маршалізація">Перетворення</abbr> даних
+## <abbr title="also known as: serialization, parsing, marshalling – також відомо як: серіалізація, парсинг, маршалізація">Перетворення</abbr> даних { #data-conversion }
 
-ЯкÑ\89о Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и Ñ\86ей Ð¿Ñ\80иклад Ñ\96 Ð¿ÐµÑ\80ейÑ\82и Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, Ñ\82о Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е Ñ\82акÑ\83 відповідь:
+ЯкÑ\89о Ð²Ð¸ Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Ñ\86ей Ð¿Ñ\80иклад Ñ\96 Ð²Ñ\96дкÑ\80иÑ\94Ñ\82е Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96 <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, Ñ\82о Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е відповідь:
 
 ```JSON
 {"item_id":3}
 
 /// check | Примітка
 
-Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`. Це Python `int`, а не рядок `"3"`.
+Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`, як Python `int`, а не рядок `"3"`.
 
-Отже, з таким оголошенням типу  **FastAPI**  автоматично виконує <abbr title="перетворення рядка, що надходить із HTTP-запиту, у типи даних Python">"парсинг"</abbr> запитів.
+Отже, з таким оголошенням типу **FastAPI** надає вам автоматичний <abbr title="converting the string that comes from an HTTP request into Python data – перетворення рядка, що надходить із HTTP-запиту, у дані Python">«parsing»</abbr> запиту.
 
 ///
 
-## <abbr title="Або валідація">Перевірка</abbr> даних
+## Валідація даних { #data-validation }
 
¯ÐºÑ\89о Ð¶ Ð²Ñ\96дкÑ\80иÑ\82и Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96 Ð¿Ð¾Ñ\81иланнÑ\8f <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, Ñ\82о Ð¿Ð¾Ð±Ð°Ñ\87имо Ñ\86Ñ\96каву HTTP-помилку:
\90ле Ñ\8fкÑ\89о Ð²Ð¸ Ð¿ÐµÑ\80ейдеÑ\82е Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96 Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, Ð²Ð¸ Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е Ð³Ð°Ñ\80ну HTTP-помилку:
 
 ```JSON
 {
   ]
 }
 ```
-тому що параметр шляху має значення `"foo"`, яке не є типом `int`.
 
-Таку саму помилку отримаємо, якщо передати `float` замість `int`, як бачимо, у цьому прикладі: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
+тому що параметр шляху `item_id` мав значення `"foo"`, яке не є `int`.
+
+Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
 
 /// check | Примітка
 
-Отже,  **FastAPI** надає перевірку типів з таким самим оголошенням типу в Python.
+Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних.
 
\97веÑ\80нÑ\96Ñ\82Ñ\8c Ñ\83вагÑ\83, Ñ\89о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ñ\82акож Ñ\87Ñ\96Ñ\82ко Ð²ÐºÐ°Ð·Ñ\83Ñ\94 Ñ\81аме Ð½Ð° Ñ\82е Ð¼Ñ\96Ñ\81Ñ\86е, Ð´Ðµ Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8f Ð½Ðµ Ð¿Ñ\80ойÑ\88ла.
+Зверніть увагу, що помилка також чітко вказує саме місце, де валідація не пройшла.
 
-Це Ð½ÐµÐ¹Ð¼Ð¾Ð²Ñ\96Ñ\80но ÐºÐ¾Ñ\80иÑ\81но Ð¿Ñ\96д Ñ\87аÑ\81 Ñ\80озÑ\80обки Ñ\82а Ð´ÐµÐ±Ð°Ð³Ñ\96нгÑ\83 коду, що взаємодіє з вашим API.
+Це Ð½ÐµÐ¹Ð¼Ð¾Ð²Ñ\96Ñ\80но ÐºÐ¾Ñ\80иÑ\81но Ð¿Ñ\96д Ñ\87аÑ\81 Ñ\80озÑ\80обки Ñ\82а Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ\8f коду, що взаємодіє з вашим API.
 
 ///
 
-## Документація
+## Документація { #documentation }
 
¢ÐµÐ¿ÐµÑ\80 ÐºÐ¾Ð»Ð¸ Ð²Ñ\96дкÑ\80иÑ\94Ñ\82е Ñ\81вÑ\96й Ð±Ñ\80аÑ\83зеÑ\80 Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>, Ñ\82о Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð·Ð³ÐµÐ½ÐµÑ\80ованÑ\83, Ñ\96нÑ\82еÑ\80акÑ\82ивнÑ\83 API-докÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e:
\90 ÐºÐ¾Ð»Ð¸ Ð²Ð¸ Ð²Ñ\96дкÑ\80иÑ\94Ñ\82е Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96 <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>, Ð²Ð¸ Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83, Ñ\96нÑ\82еÑ\80акÑ\82ивнÑ\83, API-докÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e Ð½Ð° ÐºÑ\88Ñ\82алÑ\82:
 
 <img src="/img/tutorial/path-params/image01.png">
 
 /// check | Примітка
 
-Знову ж таки, лише з цим самим оголошенням типу в Python, FastAPI надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
-
-Зверніть увагу, що параметр шляху оголошений як ціле число.
+Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
 
+Зверніть увагу, що параметр шляху оголошено як ціле число.
 
 ///
 
-## Переваги стандартизації, альтернативна документація
+## Переваги стандартів, альтернативна документація { #standards-based-benefits-alternative-documentation }
 
 І оскільки згенерована схема відповідає стандарту <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a>, існує багато сумісних інструментів.
 
\97 Ñ\86Ñ\96Ñ\94Ñ\97 Ð¿Ñ\80иÑ\87ини FastAPI Ñ\82акож Ð½Ð°Ð´Ð°Ñ\94 Ð°Ð»Ñ\8cÑ\82еÑ\80наÑ\82ивнÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e API (викоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и ReDoc), Ð´Ð¾ Ñ\8fкоÑ\97 Ð¼Ð¾Ð¶Ð½Ð° отримати доступ за посиланням <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>:
§ÐµÑ\80ез Ñ\86е **FastAPI** Ñ\82акож Ð½Ð°Ð´Ð°Ñ\94 Ð°Ð»Ñ\8cÑ\82еÑ\80наÑ\82ивнÑ\83 API-докÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e (викоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и ReDoc), Ð´Ð¾ Ñ\8fкоÑ\97 Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е отримати доступ за посиланням <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>:
 
 <img src="/img/tutorial/path-params/image02.png">
 
-Таким чином, існує багато сумісних інструментів, включаючи інструменти для генерації коду для багатьох мов.
+Так само, існує багато сумісних інструментів. Зокрема інструменти генерації коду для багатьох мов.
 
+## Pydantic { #pydantic }
 
-## Pydantic
+Уся валідація даних виконується за лаштунками за допомогою <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>, тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках.
 
ся валідація даних виконується за лаштунками за допомогою <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>, тому Ви отримуєте всі переваги від його використання. І можете бути впевнені, що все в надійних руках.
и можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних.
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\82Ñ\96 Ñ\81амÑ\96 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ñ\82ипÑ\96в Ð·  `str`, `float`, `bool` Ñ\82а Ð±Ð°Ð³Ð°Ñ\82Ñ\8cма Ñ\96нÑ\88ими Ñ\81кладними Ñ\82ипами Ð´Ð°Ð½Ð¸Ñ\85.
\94екÑ\96лÑ\8cка Ð· Ð½Ð¸Ñ\85 Ñ\80озглÑ\8fдаÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ð½Ð°Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\80оздÑ\96лаÑ\85 Ð¿Ð¾Ñ\81Ñ\96бника.
 
-Декілька з них будуть розглянуті в наступних розділах посібника.
+## Порядок має значення { #order-matters }
 
-## Порядок має значення
+Під час створення *операцій шляху* можуть виникати ситуації, коли у вас є фіксований шлях.
 
\9fÑ\80и Ñ\81Ñ\82воÑ\80еннÑ\96 *опеÑ\80аÑ\86Ñ\96й Ñ\88лÑ\8fÑ\85Ñ\83* Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð²Ð¸Ð½Ð¸ÐºÐ°Ñ\82и Ñ\81иÑ\82Ñ\83аÑ\86Ñ\96Ñ\97, ÐºÐ¾Ð»Ð¸ Ñ\88лÑ\8fÑ\85 Ñ\84Ñ\96кÑ\81ований.
\9dапÑ\80иклад, `/users/me` â\80\94 Ð¿Ñ\80ипÑ\83Ñ\81Ñ\82Ñ\96мо, Ñ\86е Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ð´Ð°Ð½Ð¸Ñ\85 Ð¿Ñ\80о Ð¿Ð¾Ñ\82оÑ\87ного ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а.
 
\9dапÑ\80иклад, `/users/me`. Ð\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\89о Ñ\86е Ñ\88лÑ\8fÑ\85 Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ð´Ð°Ð½Ð¸Ñ\85 Ð¿Ñ\80о Ð¿Ð¾Ñ\82оÑ\87ного ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а.
\86 Ñ\82одÑ\96 Ñ\83 Ð²Ð°Ñ\81 Ñ\82акож Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ñ\88лÑ\8fÑ\85 `/users/{user_id}` Ð´Ð»Ñ\8f Ð¾Ñ\82Ñ\80иманнÑ\8f Ð´Ð°Ð½Ð¸Ñ\85 Ð¿Ñ\80о ÐºÐ¾Ð½ÐºÑ\80еÑ\82ного ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð·Ð° Ð¹Ð¾Ð³Ð¾ ID.
 
\90 Ñ\82акож Ñ\83 Ð²Ð°Ñ\81 Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ñ\88лÑ\8fÑ\85 `/users/{user_id}`, Ñ\89об Ð¾Ñ\82Ñ\80имаÑ\82и Ð´Ð°Ð½Ñ\96 Ð¿Ñ\80о ÐºÐ¾Ð½ÐºÑ\80еÑ\82ного ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð·Ð° Ð¹Ð¾Ð³Ð¾ ID.
\9eÑ\81кÑ\96лÑ\8cки *опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð¾Ñ\86Ñ\96нÑ\8eÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð¿Ð¾ Ñ\87еÑ\80зÑ\96, Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¿ÐµÑ\80еконаÑ\82иÑ\81Ñ\8f, Ñ\89о Ñ\88лÑ\8fÑ\85 Ð´Ð»Ñ\8f `/users/me` Ð¾Ð³Ð¾Ð»Ð¾Ñ\88ено Ð¿ÐµÑ\80ед Ñ\88лÑ\8fÑ\85ом Ð´Ð»Ñ\8f `/users/{user_id}`:
 
-Оскільки *операції шляху* оцінюються по черзі, Ви повинні переконатися, що шлях для `/users/me` оголошений перед шляхом для `/users/{user_id}`:
+{* ../../docs_src/path_params/tutorial003_py39.py hl[6,11] *}
 
-{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
+Інакше шлях для `/users/{user_id}` також відповідатиме `/users/me`, «вважаючи», що отримує параметр `user_id` зі значенням `"me"`.
 
\86накÑ\88е Ñ\88лÑ\8fÑ\85 Ð´Ð»Ñ\8f `/users/{user_id}` Ñ\82акож Ð±Ñ\83де Ð²Ñ\96дповÑ\96даÑ\82и Ð´Ð»Ñ\8f `/users/me`, "вважаÑ\8eÑ\87и", Ñ\89о Ð²Ñ\96н Ð¾Ñ\82Ñ\80имÑ\83Ñ\94 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `user_id` Ð·Ñ\96 Ð·Ð½Ð°Ñ\87еннÑ\8fм `"me"`.
¢Ð°Ðº Ñ\81амо Ð²Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80евизнаÑ\87иÑ\82и Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\8e Ñ\88лÑ\8fÑ\85Ñ\83:
 
-Аналогічно, Ви не можете оголосити операцію шляху:
+{* ../../docs_src/path_params/tutorial003b_py39.py hl[6,11] *}
 
-{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
+Завжди використовуватиметься перша, оскільки шлях збігається першим.
 
-Перша операція буде завжди використовуватися, оскільки шлях збігається першим.
-## Попередньо визначені значення
+## Попередньо визначені значення { #predefined-values }
 
-ЯкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 *опеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\88лÑ\8fÑ\85Ñ\83*, Ñ\8fка Ð¿Ñ\80иймаÑ\94 *паÑ\80амеÑ\82Ñ\80 Ñ\88лÑ\8fÑ\85Ñ\83*, Ð°Ð»Ðµ Ð\92и Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96 Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f *паÑ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83* Ð±Ñ\83ли Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cо Ð²Ð¸Ð·Ð½Ð°Ñ\87енÑ\96, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ñ\81Ñ\82андаÑ\80Ñ\82ний Python <abbr title="пеÑ\80елÑ\96Ñ\87еннÑ\8f">Enum</abbr>.
+ЯкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 *опеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\88лÑ\8fÑ\85Ñ\83*, Ñ\8fка Ð¾Ñ\82Ñ\80имÑ\83Ñ\94 *паÑ\80амеÑ\82Ñ\80 Ñ\88лÑ\8fÑ\85Ñ\83*, Ð°Ð»Ðµ Ð²Ð¸ Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ\96 ÐºÐ¾Ñ\80екÑ\82нÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f *паÑ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83* Ð±Ñ\83ли Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\8cо Ð²Ð¸Ð·Ð½Ð°Ñ\87енÑ\96, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ñ\81Ñ\82андаÑ\80Ñ\82ний Python <abbr title="Enumeration">`Enum`</abbr>.
 
-### Створення класу `Enum`
+### Створіть клас `Enum` { #create-an-enum-class }
 
 Імпортуйте `Enum` і створіть підклас, що наслідується від `str` та `Enum`.
 
-Наслідуючи від `str`, документація API зможе визначити, що значення повинні бути типу `string`, і правильно їх відобразить.
-
-Після цього створіть атрибути класу з фіксованими значеннями, які будуть доступними допустимими значеннями:
+Завдяки наслідуванню від `str` документація API зможе визначити, що значення повинні бути типу `string`, і зможе коректно їх відобразити.
 
-{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
+Після цього створіть атрибути класу з фіксованими значеннями, які будуть доступними коректними значеннями:
 
-/// info | Додаткова інформація
-
-<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Перелічення (або enums) доступні в Python</a> починаючи з версії 3.4.
-
-///
+{* ../../docs_src/path_params/tutorial005_py39.py hl[1,6:9] *}
 
 /// tip | Порада
 
-Якщо вам цікаво, "AlexNet", "ResNet" та "LeNet" — це просто назви ML моделей <abbr title="Технічно, архітектури Deep Learning моделей">Machine Learning</abbr>.
+Якщо вам цікаво, «AlexNet», «ResNet» та «LeNet» — це просто назви Machine Learning <abbr title="Technically, Deep Learning model architectures – технічно, архітектури моделей Deep Learning">models</abbr>.
 
 ///
 
-
-### Оголосіть *параметр шляху*
+### Оголосіть *параметр шляху* { #declare-a-path-parameter }
 
 Потім створіть *параметр шляху* з анотацією типу, використовуючи створений вами клас enum (`ModelName`):
 
-{* ../../docs_src/path_params/tutorial005.py hl[16] *}
+{* ../../docs_src/path_params/tutorial005_py39.py hl[16] *}
 
-### Перевірка документації
+### Перевірте документацію { #check-the-docs }
 
\9eÑ\81кÑ\96лÑ\8cки Ð´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f Ð´Ð»Ñ\8f *паÑ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83* Ð²Ð¸Ð·Ð½Ð°Ñ\87енÑ\96 Ð·Ð°Ð·Ð´Ð°Ð»ÐµÐ³Ñ\96дÑ\8c, Ñ\96нÑ\82еÑ\80акÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ð·Ð¼Ð¾Ð¶Ðµ ÐºÑ\80аÑ\81иво Ñ\97Ñ\85 Ð²Ñ\96добÑ\80азити:
\9eÑ\81кÑ\96лÑ\8cки Ð´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f Ð´Ð»Ñ\8f *паÑ\80амеÑ\82Ñ\80а Ñ\88лÑ\8fÑ\85Ñ\83* Ð²Ð¸Ð·Ð½Ð°Ñ\87енÑ\96 Ð·Ð°Ð·Ð´Ð°Ð»ÐµÐ³Ñ\96дÑ\8c, Ñ\96нÑ\82еÑ\80акÑ\82ивна Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ð¼Ð¾Ð¶Ðµ ÐºÑ\80аÑ\81иво Ñ\97Ñ\85 Ð¿Ð¾ÐºÐ°Ð·Ð°ти:
 
 <img src="/img/tutorial/path-params/image03.png">
 
-### Робота з *перелічуваннями* у Python
+### Робота з Python *переліченнями* { #working-with-python-enumerations }
 
-Значення *параметра шляху* буде елементом *перелічування*.
+Значення *параметра шляху* буде *елементом перелічування*.
 
-#### Ð\9fоÑ\80Ñ\96внÑ\8fннÑ\8f *елеменÑ\82Ñ\96в Ð¿ÐµÑ\80елÑ\96Ñ\87Ñ\83ваннÑ\8f*
+#### Ð\9fоÑ\80Ñ\96внÑ\8fйÑ\82е *елеменÑ\82и Ð¿ÐµÑ\80елÑ\96Ñ\87Ñ\83ваннÑ\8f* { #compare-enumeration-members }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ñ\80Ñ\96внÑ\8eваÑ\82и Ð¹Ð¾Ð³Ð¾ Ð· *елеменÑ\82ами перелічування* у створеному вами enum `ModelName`:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ñ\80Ñ\96внÑ\8eваÑ\82и Ð¹Ð¾Ð³Ð¾ Ð· *елеменÑ\82ом перелічування* у створеному вами enum `ModelName`:
 
-{* ../../docs_src/path_params/tutorial005.py hl[17] *}
+{* ../../docs_src/path_params/tutorial005_py39.py hl[17] *}
 
-#### Ð\9eÑ\82Ñ\80иманнÑ\8f *знаÑ\87еннÑ\8f Ð¿ÐµÑ\80елÑ\96Ñ\87Ñ\83ваннÑ\8f*
+#### Ð\9eÑ\82Ñ\80имайÑ\82е *знаÑ\87еннÑ\8f Ð¿ÐµÑ\80елÑ\96Ñ\87Ñ\83ваннÑ\8f* { #get-the-enumeration-value }
 
 Ви можете отримати фактичне значення (у цьому випадку це `str`), використовуючи `model_name.value`, або загалом `your_enum_member.value`:
 
-{* ../../docs_src/path_params/tutorial005.py hl[20] *}
+{* ../../docs_src/path_params/tutorial005_py39.py hl[20] *}
 
 /// tip | Порада
 
-Ви також можете отримати доступ до значення `"lenet"`, використовуючи `ModelName.lenet.value`.
+Ви також можете отримати доступ до значення `"lenet"` через `ModelName.lenet.value`.
 
 ///
 
+#### Поверніть *елементи перелічування* { #return-enumeration-members }
 
-#### Повернення *елементів перелічування*
-
-Ви можете повертати *елементи перелічування* з вашої *операції шляху*, навіть вкладені у JSON-тіло (наприклад, `dict`).
+Ви можете повертати *елементи enum* з вашої *операції шляху*, навіть вкладені у JSON-тіло (наприклад, `dict`).
 
 Вони будуть перетворені на відповідні значення (у цьому випадку рядки) перед поверненням клієнту:
 
-{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
+{* ../../docs_src/path_params/tutorial005_py39.py hl[18,21,23] *}
 
\9dа Ñ\81Ñ\82оÑ\80онÑ\96 ÐºÐ»Ñ\96Ñ\94нÑ\82а Ð\92и отримаєте відповідь у форматі JSON, наприклад:
\9dа Ñ\81Ñ\82оÑ\80онÑ\96 ÐºÐ»Ñ\96Ñ\94нÑ\82а Ð²и отримаєте відповідь у форматі JSON, наприклад:
 
 ```JSON
 {
 }
 ```
 
-## Path-параметри, що містять шляхи
-
-Припустимо, у вас є *операція шляху* з маршрутом `/files/{file_path}`.
+## Параметри шляху, що містять шляхи { #path-parameters-containing-paths }
 
\90ле Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно, Ñ\89об `file_path` Ð¼Ñ\96Ñ\81Ñ\82ив *Ñ\88лÑ\8fÑ\85*, Ð½Ð°Ð¿Ñ\80иклад `home/johndoe/myfile.txt`.
\9fÑ\80ипÑ\83Ñ\81Ñ\82Ñ\96мо, Ñ\83 Ð²Ð°Ñ\81 Ñ\94 *опеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\88лÑ\8fÑ\85Ñ\83* Ð·Ñ\96 Ñ\88лÑ\8fÑ\85ом `/files/{file_path}`.
 
\9eÑ\82же, URL Ð´Ð»Ñ\8f Ñ\86Ñ\8cого Ñ\84айлÑ\83 Ð²Ð¸Ð³Ð»Ñ\8fдаÑ\82име Ñ\82ак: `/files/home/johndoe/myfile.txt`.
\90ле Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно, Ñ\89об `file_path` Ñ\81ам Ð¼Ñ\96Ñ\81Ñ\82ив *Ñ\88лÑ\8fÑ\85*, Ð½Ð°Ð¿Ñ\80иклад `home/johndoe/myfile.txt`.
 
+Отже, URL для цього файлу виглядатиме приблизно так: `/files/home/johndoe/myfile.txt`.
 
+### Підтримка OpenAPI { #openapi-support }
 
-### Підтримка OpenAPI
+OpenAPI не підтримує спосіб оголошення *параметра шляху*, який має містити всередині *шлях*, оскільки це може призвести до сценаріїв, які складно тестувати та визначати.
 
-OpenAPI не підтримує спосіб оголошення *параметра шляху*, що містить *шлях* всередині, оскільки це може призвести до сценаріїв, які складно тестувати та визначати.
+Проте ви все одно можете зробити це в **FastAPI**, використовуючи один із внутрішніх інструментів Starlette.
 
\9eднак (однаÑ\87е), Ð\92и Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ñ\80обиÑ\82и Ñ\86е Ð² **FastAPI**, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ð¾Ð´Ð¸Ð½ Ñ\96з Ð²Ð½Ñ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\96Ñ\85 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в Starlette.
\86 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ð²Ñ\81е Ñ\89е Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82име, Ñ\85оÑ\87а Ð¹ Ð½Ðµ Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82име Ð¶Ð¾Ð´Ð½Ð¾Ñ\97 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97, Ñ\8fка Ð± ÐºÐ°Ð·Ð°Ð»Ð°, Ñ\89о Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð°Ñ\94 Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Ñ\88лÑ\8fÑ\85.
 
-Документація все ще працюватиме, хоча й не додаватиме опису про те, що параметр повинен містити шлях.
+### Конвертер шляху { #path-convertor }
 
-### Конвертер шляху
-
-Використовуючи опцію безпосередньо зі Starlette, Ви можете оголосити *параметр шляху*, що містить *шлях*, використовуючи URL на кшталт:
+Використовуючи опцію безпосередньо зі Starlette, ви можете оголосити *параметр шляху*, що містить *шлях*, використовуючи URL на кшталт:
 
 ```
 /files/{file_path:path}
 ```
-У цьому випадку ім'я параметра — `file_path`, а остання частина `:path` вказує на те, що параметр повинен відповідати будь-якому *шляху*.
 
-Отже, Ви можете використати його так:
+У цьому випадку ім’я параметра — `file_path`, а остання частина `:path` вказує, що параметр має відповідати будь-якому *шляху*.
+
+Отже, ви можете використати його так:
 
-{* ../../docs_src/path_params/tutorial004.py hl[6] *}
+{* ../../docs_src/path_params/tutorial004_py39.py hl[6] *}
 
 /// tip | Порада
 
@@ -246,15 +237,15 @@ OpenAPI не підтримує спосіб оголошення *параме
 
 ///
 
-## Підсумок
+## Підсумок { #recap }
 
\97 **FastAPI**, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и ÐºÐ¾Ñ\80оÑ\82кÑ\96, Ñ\96нÑ\82Ñ\83Ñ\97Ñ\82ивно Ð·Ñ\80озÑ\83мÑ\96лÑ\96 Ñ\82а Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ñ\82ипÑ\96в Python, Ð\92и отримуєте:
\97 **FastAPI**, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и ÐºÐ¾Ñ\80оÑ\82кÑ\96, Ñ\96нÑ\82Ñ\83Ñ\97Ñ\82ивно Ð·Ñ\80озÑ\83мÑ\96лÑ\96 Ñ\82а Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ñ\82ипÑ\96в Python, Ð²и отримуєте:
 
-* Підтримку в редакторі: перевірка помилок, автодоповнення тощо.
-* "<abbr title="перетворення рядка, що надходить з HTTP-запиту, у типи даних Python">Парсинг</abbr>" даних
+* Підтримку редактора: перевірка помилок, автодоповнення тощо.
+* Перетворення даних «<abbr title="converting the string that comes from an HTTP request into Python data – перетворення рядка, що надходить з HTTP-запиту, у дані Python">parsing</abbr>»
 * Валідацію даних
 * Анотацію API та автоматичну документацію
 
 І вам потрібно оголосити їх лише один раз.
 
-Це, ймовірно, основна видима перевага **FastAPI** порівняно з альтернативними фреймворками (окрім високої продуктивності).
+Це, ймовірно, основна видима перевага **FastAPI** порівняно з альтернативними фреймворками (окрім сирої продуктивності).
index 97eb82fa1b249809a2387f1b35a4c37f1c682f9e..a28bf6c27c2199ed943011ad6f14534065b2854e 100644 (file)
@@ -1,4 +1,4 @@
-# Моделі Query параметрів
+# Моделі параметрів запиту { #query-parameter-models }
 
 Якщо у Вас є група **query параметрів**, які пов’язані між собою, Ви можете створити **Pydantic-модель** для їх оголошення.
 
@@ -10,7 +10,7 @@
 
 ///
 
-## Query параметри з Pydantic-моделлю
+## Query параметри з Pydantic-моделлю { #query-parameters-with-a-pydantic-model }
 
 Оголосіть **query параметри**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть цей параметр як `Query`:
 
@@ -18,7 +18,7 @@
 
 **FastAPI**  буде **витягувати** дані для **кожного поля** з **query параметрів** у запиті та передавати їх у визначену вами Pydantic-модель.
 
-## Перевірте документацію
+## Перевірте документацію { #check-the-docs }
 
 Ви можете побачити параметри запиту в UI документації за `/docs`:
 
@@ -26,7 +26,7 @@
 <img src="/img/tutorial/query-param-models/image01.png">
 </div>
 
-## Заборона зайвих Query параметрів
+## Заборона зайвих Query параметрів { #forbid-extra-query-parameters }
 
 У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** query параметри, які дозволено отримувати.
 
@@ -34,7 +34,7 @@
 
 {* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
 
-Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку**.
+Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку** відповідь.
 
 Наприклад, якщо клієнт спробує надіслати query параметр `tool` зі значенням `plumbus`, як у цьому запиті:
 
@@ -57,11 +57,11 @@ https://example.com/items/?limit=10&tool=plumbus
 }
 ```
 
-## Підсумок
+## Підсумок { #summary }
 
 Ви можете використовувати **Pydantic-моделі** для оголошення **query параметрів** у **FastAPI**. 😎
 
-/// tip | Підказка
+/// tip | Порада
 
 Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення cookie та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
 
index cd3f4ad93534764499aed0999e0bb5fcae319b73..414987880bcd9896b8c86ad1bd0d5124ace742b8 100644 (file)
@@ -1,26 +1,26 @@
-# Query параметри та валідація рядків
+# Query параметри та валідація рядків { #query-parameters-and-string-validations }
 
-**FastAPI** Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ñ\82а Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ð´Ð»Ñ\8f Ð\92аших параметрів.
+**FastAPI** Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ñ\82а Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ð´Ð»Ñ\8f Ð²аших параметрів.
 
 Розглянемо цей додаток як приклад:
 
 {* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
 
-Query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `q` Ð¼Ð°Ñ\94 Ñ\82ип `str | None`, Ñ\89о Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ð²Ñ\96н Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ñ\8fк `str`, Ñ\82ак Ñ\96 `None`. Ð\97а Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð²Ñ\96н Ð¼Ð°Ñ\94 Ð·Ð½Ð°Ñ\87еннÑ\8f `None`, Ñ\82омÑ\83 FastAPI Ñ\80озÑ\83мÑ\96Ñ\94, Ñ\89о Ñ\86ей Ð¿Ð°Ñ\80амеÑ\82Ñ\80 не є обов'язковим.
+Query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `q` Ð¼Ð°Ñ\94 Ñ\82ип `str | None`, Ñ\89о Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, Ñ\89о Ð²Ñ\96н Ð¼Ð°Ñ\94 Ñ\82ип `str`, Ð°Ð»Ðµ Ñ\82акож Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и `None`, Ñ\96 Ñ\81пÑ\80авдÑ\96, Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм â\80\94 `None`, Ñ\82ож FastAPI Ð·Ð½Ð°Ñ\82име, Ñ\89о Ð²Ñ\96н не є обов'язковим.
 
 /// note | Примітка
 
-FastAPI Ð·Ð½Ð°Ñ\94, Ñ\89о `q` не є обов’язковим, завдяки значенню за замовчуванням `= None`.
+FastAPI Ð·Ð½Ð°Ñ\82име, Ñ\89о Ð·Ð½Ð°Ñ\87еннÑ\8f `q` не є обов’язковим, завдяки значенню за замовчуванням `= None`.
 
\92икоÑ\80иÑ\81Ñ\82аннÑ\8f `str | None` Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ð\92ашому редактору коду надавати кращу підтримку та виявляти помилки.
\92икоÑ\80иÑ\81Ñ\82аннÑ\8f `str | None` Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ð²ашому редактору коду надавати кращу підтримку та виявляти помилки.
 
 ///
 
-## Додаткова валідація
+## Додаткова валідація { #additional-validation }
 
-Ми хочемо, щоб навіть якщо `q` є необов’язковим, **його довжина не перевищувала 50 символів**, якщо він все ж буде переданий.
+Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, **його довжина не перевищувала 50 символів**.
 
-### Імпорт `Query` та `Annotated`
+### Імпорт `Query` та `Annotated` { #import-query-and-annotated }
 
 Щоб це зробити, спочатку імпортуємо:
 
@@ -33,13 +33,13 @@ FastAPI знає, що `q` не є обов’язковим, завдяки з
 
 FastAPI додав підтримку `Annotated` (і почав рекомендувати його) у версії 0.95.0.
 
-ЯкÑ\89о Ñ\83 Ð\92ас старіша версія, під час використання `Annotated` можуть виникати помилки.
+ЯкÑ\89о Ñ\83 Ð²ас старіша версія, під час використання `Annotated` можуть виникати помилки.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`.
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²и [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`.
 
 ///
 
-## Використання `Annotated` у типі параметра `q`
+## Використання `Annotated` у типі параметра `q` { #use-annotated-in-the-type-for-the-q-parameter }
 
 Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}?
 
@@ -55,7 +55,7 @@ q: str | None = None
 
 ////
 
-//// tab | Python 3.8+
+//// tab | Python 3.9+
 
 ```Python
 q: Union[str, None] = None
@@ -73,7 +73,7 @@ q: Annotated[str | None] = None
 
 ////
 
-//// tab | Python 3.8+
+//// tab | Python 3.9+
 
 ```Python
 q: Annotated[Union[str, None]] = None
@@ -85,33 +85,33 @@ q: Annotated[Union[str, None]] = None
 
 А тепер переходимо до цікавого! 🎉
 
-## Додавання `Query` до `Annotated` у параметр `q`
+## Додавання `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 | Підказка
+/// tip | Порада
 
\9cи використовуємо `Query()`, оскільки це **query параметр**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
¢Ñ\83Ñ\82 Ð¼и використовуємо `Query()`, оскільки це **query параметр**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
 
 ///
 
 Тепер FastAPI:
 
-* **Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c** Ð´Ð°Ð½Ñ\96, Ñ\89об Ð¿ÐµÑ\80еконаÑ\82иÑ\81Ñ\8f, Ñ\89о Ñ\97Ñ\85нÑ\8f Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð° Ð½Ðµ Ð¿ÐµÑ\80евиÑ\89Ñ\83Ñ\94 50 Ñ\81имволÑ\96в
+* **Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82Ñ\8c** Ð´Ð°Ð½Ñ\96, Ñ\89об Ð¿ÐµÑ\80еконаÑ\82иÑ\81Ñ\8f, Ñ\89о Ñ\97Ñ\85нÑ\8f Ð¼Ð°ÐºÑ\81ималÑ\8cна Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð° â\80\94 50 Ñ\81имволÑ\96в
 * Покажe **чітку помилку** клієнту, якщо дані недійсні
 * **Задокументує** параметр в OpenAPI-схемі *операції шляху* (що відобразиться в **автоматично згенерованій документації**)
 
-## Альтернативний (застарілий) метод: Query як значення за замовчуванням
+## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value }
 
-У попередніх версіях FastAPI (до <abbr title="до 2023-03">0.95.0</abbr>) `Query` використовувався як значення за замовчуванням для параметра, а не всередині `Annotated`. Ви, ймовірно, побачите код, який використовує цей підхід, тому варто розглянути його.
+У попередніх версіях FastAPI (до <abbr title="before 2023-03 – до 2023-03">0.95.0</abbr>) потрібно було використовувати `Query` як значення за замовчуванням параметра, замість того, щоб додавати його в `Annotated`. Є висока ймовірність, що ви зустрінете код із таким підходом, тож я поясню його.
 
-/// tip | Підказка
+/// tip | Порада
 
 Для нового коду та коли це можливо, використовуйте `Annotated`, як показано вище. Це має багато переваг (пояснених нижче) і не має недоліків. 🍰
 
@@ -121,7 +121,7 @@ q: Annotated[Union[str, None]] = None
 
 {* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *}
 
-Оскільки в цьому випадку (без `Annotated`) нам потрібно замінити `None` у функції на `Query()`, тепер ми повинні явно встановити значення за замовчуванням через параметр `Query(default=None)`. Це виконує ту саму роль визначення значення за замовчуванням (принаймні для FastAPI).
+Оскільки в цьому випадку (без `Annotated`) нам потрібно замінити значення за замовчуванням `None` у функції на `Query()`, тепер ми повинні встановити значення за замовчуванням через параметр `Query(default=None)`. Це виконує ту саму роль визначення значення за замовчуванням (принаймні для FastAPI).
 
 Таким чином:
 
@@ -135,9 +135,10 @@ q: str | None = Query(default=None)
 ```Python
 q: str | None = None
 ```
-Але у версії з `Query`  ми явно вказуємо, що це query параметр.
 
-Далі ми можемо передавати `Query` додаткові параметри, зокрема `max_length`, який застосовується до рядків:
+Але у версії з `Query` ми явно вказуємо, що це query параметр.
+
+Далі ми можемо передавати `Query` додаткові параметри. У цьому випадку — параметр `max_length`, який застосовується до рядків:
 
 ```Python
 q: str | None = Query(default=None, max_length=50)
@@ -145,11 +146,11 @@ q: str | None = Query(default=None, max_length=50)
 
 Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI *операції шляху*.
 
-### `Query` як значення за замовчуванням або всередині `Annotated`
+### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated }
 
 Важливо пам’ятати, якщо використовувати `Query` всередині `Annotated`, не можна задавати параметр `default` у `Query`.
 
-Замість цього використовуйте значення за замовчуванням у самій функції. Інакше це буде нелогічно.
+Замість цього використовуйте фактичне значення за замовчуванням параметра функції. Інакше це буде непослідовно.
 
 Наприклад, цей варіант є некоректним:
 
@@ -159,39 +160,39 @@ q: Annotated[str, Query(default="rick")] = "morty"
 
 ...тому, що не зрозуміло, яке значення має бути значенням за замовчуванням: `"rick"` чи `"morty"`.
 
\9aоÑ\80екÑ\82нÑ\96 Ð²Ð°Ñ\80Ñ\96анÑ\82и:
¢Ð¾Ð¶ Ð²Ð¸ Ð±Ñ\83деÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и (бажано):
 
 ```Python
 q: Annotated[str, Query()] = "rick"
 ```
 
-...або Ñ\83 Ñ\81Ñ\82аÑ\80иÑ\85 ÐºÐ¾Ð´Ð¾Ð²Ð¸Ñ\85 Ð±Ð°Ð·Ð°Ñ\85 Ð\92и знайдете:
+...або Ñ\83 Ñ\81Ñ\82аÑ\80иÑ\85 ÐºÐ¾Ð´Ð¾Ð²Ð¸Ñ\85 Ð±Ð°Ð·Ð°Ñ\85 Ð²и знайдете:
 
 ```Python
 q: str = Query(default="rick")
 ```
 
-### Переваги використання `Annotated`
+### Переваги використання `Annotated` { #advantages-of-annotated }
 
 **Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓
 
-Значення **за замовчуванням** параметра **функції** є його **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌
+Значення **за замовчуванням** параметра **функції** є **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е **викликаÑ\82и** Ñ\82Ñ\83 Ñ\81амÑ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e **в Ñ\96нÑ\88иÑ\85 Ð¼Ñ\96Ñ\81Ñ\86Ñ\8fÑ\85** Ð±ÐµÐ· FastAPI, Ñ\96 Ð²Ð¾Ð½Ð° **пÑ\80аÑ\86Ñ\8eваÑ\82име Ð¾Ñ\87Ñ\96кÑ\83вано**. Ð¯ÐºÑ\89о Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\94 **обовâ\80\99Ñ\8fзковим** (без Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм), Ð\92аÑ\88 **Ñ\80едакÑ\82оÑ\80** Ð¿Ð¾Ð²Ñ\96домиÑ\82Ñ\8c Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ð° **Python** Ñ\82акож Ð²Ð¸Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ñ\8fкÑ\89о Ð\92и виконаєте функцію без передавання цього параметра.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е **викликаÑ\82и** Ñ\82Ñ\83 Ñ\81амÑ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8e **в Ñ\96нÑ\88иÑ\85 Ð¼Ñ\96Ñ\81Ñ\86Ñ\8fÑ\85** Ð±ÐµÐ· FastAPI, Ñ\96 Ð²Ð¾Ð½Ð° **пÑ\80аÑ\86Ñ\8eваÑ\82име Ð¾Ñ\87Ñ\96кÑ\83вано**. Ð¯ÐºÑ\89о Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ñ\94 **обовâ\80\99Ñ\8fзковим** (без Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм), Ð²Ð°Ñ\88 **Ñ\80едакÑ\82оÑ\80** Ð¿Ð¾Ð²Ñ\96домиÑ\82Ñ\8c Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ð° **Python** Ñ\82акож Ð²Ð¸Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ñ\8fкÑ\89о Ð²и виконаєте функцію без передавання цього параметра.
 
-ЯкÑ\89о Ð\92и Ð½Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `Annotated`, Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е **(Ñ\81Ñ\82аÑ\80ий) Ñ\81Ñ\82илÑ\8c Ð·Ð½Ð°Ñ\87енÑ\8c Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм**, Ñ\82о Ð¿Ñ\80и Ð²Ð¸ÐºÐ»Ð¸ÐºÑ\83 Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð±ÐµÐ· FastAPI **в Ñ\96нÑ\88иÑ\85 Ð¼Ñ\96Ñ\81Ñ\86Ñ\8fÑ\85**, Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно **не Ð·Ð°Ð±Ñ\83Ñ\82и** Ð¿ÐµÑ\80едаÑ\82и Ñ\97й Ð°Ñ\80гÑ\83менÑ\82и, Ñ\96накÑ\88е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð²Ñ\96дÑ\80Ñ\96знÑ\8fÑ\82иÑ\81Ñ\8f Ð²Ñ\96д Ð¾Ñ\87Ñ\96кÑ\83ваниÑ\85 (напÑ\80иклад, Ð\92и Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е `QueryInfo` Ð°Ð±Ð¾ Ð¿Ð¾Ð´Ñ\96бне Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c `str`). Ð\92аÑ\88 Ñ\80едакÑ\82оÑ\80 Ð½Ðµ Ð¿Ð¾Ð²Ñ\96домиÑ\82Ñ\8c Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ñ\96 Python Ñ\82акож Ð½Ðµ Ð²Ð¸Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ð¿Ñ\80и Ð·Ð°Ð¿Ñ\83Ñ\81кÑ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð¿Ð¾ÐºÐ¸ Ð½Ðµ Ð²Ð¸Ð½Ð¸ÐºÐ½Ðµ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ\96д Ñ\87аÑ\81 Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\8f Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96й Ñ\83Ñ\81еÑ\80единÑ\96.
+ЯкÑ\89о Ð²Ð¸ Ð½Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `Annotated`, Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е **(Ñ\81Ñ\82аÑ\80ий) Ñ\81Ñ\82илÑ\8c Ð·Ð½Ð°Ñ\87енÑ\8c Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм**, Ñ\82о Ð¿Ñ\80и Ð²Ð¸ÐºÐ»Ð¸ÐºÑ\83 Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð±ÐµÐ· FastAPI **в Ñ\96нÑ\88иÑ\85 Ð¼Ñ\96Ñ\81Ñ\86Ñ\8fÑ\85**, Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно **памâ\80\99Ñ\8fÑ\82аÑ\82и** Ð¿ÐµÑ\80едаÑ\82и Ñ\97й Ð°Ñ\80гÑ\83менÑ\82и, Ñ\89об Ð²Ð¾Ð½Ð° Ð¿Ñ\80аÑ\86Ñ\8eвала ÐºÐ¾Ñ\80екÑ\82но, Ñ\96накÑ\88е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð²Ñ\96дÑ\80Ñ\96знÑ\8fÑ\82иÑ\81Ñ\8f Ð²Ñ\96д Ð¾Ñ\87Ñ\96кÑ\83ваниÑ\85 (напÑ\80иклад, Ð²Ð¸ Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е `QueryInfo` Ð°Ð±Ð¾ Ñ\89оÑ\81Ñ\8c Ð¿Ð¾Ð´Ñ\96бне Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c `str`). Ð\86 Ð²Ð°Ñ\88 Ñ\80едакÑ\82оÑ\80 Ð½Ðµ Ð¿Ð¾Ð²Ñ\96домиÑ\82Ñ\8c Ð¿Ñ\80о Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ñ\96 Python Ð½Ðµ Ñ\81каÑ\80жиÑ\82имеÑ\82Ñ\8cÑ\81Ñ\8f Ð¿Ñ\96д Ñ\87аÑ\81 Ð·Ð°Ð¿Ñ\83Ñ\81кÑ\83 Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 â\80\94 Ð»Ð¸Ñ\88е ÐºÐ¾Ð»Ð¸ Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ð²Ñ\81еÑ\80единÑ\96 Ð·Ð°Ð²ÐµÑ\80Ñ\88аÑ\82Ñ\8cÑ\81Ñ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ\8e.
 
-Оскільки `Annotated` може містити кілька анотацій метаданих, Ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a>. 🚀
+Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a>. 🚀
 
-## Додавання додаткових валідацій
+## Додавання додаткових валідацій { #add-more-validations }
 
 Ви також можете додати параметр `min_length`:
 
 {* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *}
 
-## Додавання регулярних виразів
+## Додавання регулярних виразів { #add-regular-expressions }
 
-Ви можете визначити <abbr title="Регулярний вираз (regex або regexp) — це послідовність символів, яка визначає шаблон для пошуку в рядках.">регулярний вираз</abbr> pattern, якому має відповідати параметр:
+Ви можете визначити <abbr title="A regular expression, regex or regexp is a sequence of characters that define a search pattern for strings. – Регулярний вираз (regex або regexp) — це послідовність символів, яка визначає шаблон для пошуку в рядках.">regular expression</abbr> `pattern`, якому має відповідати параметр:
 
 {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
 
@@ -201,41 +202,27 @@ q: str = Query(default="rick")
 * `fixedquery`: точно відповідає значенню `fixedquery`.
 * `$`: закінчується тут, після `fixedquery` немає жодних символів.
 
-Якщо Ви почуваєтеся розгублено щодо **"регулярних виразів"**, не хвилюйтеся. Вони є складною темою для багатьох людей. Ви все одно можете зробити багато речей без їх використання.
-
-Але тепер Ви знаєте, що коли вони знадобляться, їх можна застосовувати у **FastAPI**.
-
-### Pydantic v1 `regex` замість `pattern`
-
-До версії Pydantic 2 і FastAPI 0.100.0 параметр називався `regex` замість `pattern`, але тепер він застарів.
+Якщо ви почуваєтеся розгублено щодо **«regular expression»**, не хвилюйтеся. Це складна тема для багатьох людей. Ви все одно можете робити багато речей без використання регулярних виразів.
 
-Ви все ще можете зустріти код, який використовує його:
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *}
-
-////
+Тепер ви знаєте, що коли вони знадобляться, їх можна застосовувати у **FastAPI**.
 
-Але майте на увазі, що він є застарілим і його слід оновити до нового параметра `pattern`. 🤓
+## Значення за замовчуванням { #default-values }
 
-## Значення за замовчуванням
+Ви можете, звісно, використовувати значення за замовчуванням, відмінні від `None`.
 
-Ви можете використовувати значення за замовчуванням, відмінні від `None`.
-
-Наприклад, якщо Ви хочете оголосити параметр запиту `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
+Припустімо, що ви хочете оголосити query параметр `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
 
 {* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *}
 
-/// note | Ð¢ÐµÑ\85нÑ\96Ñ\87нÑ\96 Ð´ÐµÑ\82алÑ\96
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
 Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (not required).
 
 ///
 
-## Обов’язкові параметри
+## Обов’язкові параметри { #required-parameters }
 
-ЯкÑ\89о Ð½Ð°Ð¼ Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²ÐºÐ°Ð·Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¿ÐµÑ\80евÑ\96Ñ\80ки Ð°Ð±Ð¾ Ð¼ÐµÑ\82аданÑ\96, Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ð·Ñ\80обиÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `q` Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð¿Ñ\80оÑ\81Ñ\82о Ð½Ðµ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88уючи значення за замовчуванням, наприклад:
+ЯкÑ\89о Ð½Ð°Ð¼ Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\97 Ð°Ð±Ð¾ Ð¼ÐµÑ\82аданÑ\96, Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ð·Ñ\80обиÑ\82и query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `q` Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð¿Ñ\80оÑ\81Ñ\82о Ð½Ðµ Ð²ÐºÐ°Ð·уючи значення за замовчуванням, наприклад:
 
 ```Python
 q: str
@@ -247,43 +234,39 @@ q: str
 q: str | None = None
 ```
 
-Але тепер ми оголошуємо його з `Query`, наприклад:
-
-//// tab | Annotated
+Але тепер ми оголошуємо його з `Query`, наприклад так:
 
 ```Python
 q: Annotated[str | None, Query(min_length=3)] = None
 ```
 
-////
-
-Тому, якщо Вам потрібно зробити значення обов’язковим, використовуючи `Query`, просто не вказуйте значення за замовчуванням:
+Тому, якщо вам потрібно оголосити значення як обов’язкове під час використання `Query`, просто не вказуйте значення за замовчуванням:
 
 {* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
 
-### Ð\9eбовâ\80\99Ñ\8fзкове Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fке Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и `None`
+### Ð\9eбовâ\80\99Ñ\8fзковий, Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и `None` { #required-can-be-none }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и, Ñ\89о Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶Ðµ Ð¿Ñ\80иймаÑ\82и `None`, Ð°Ð»Ðµ Ð¿Ñ\80и Ñ\86Ñ\8cомÑ\83 Ð·Ð°Ð»Ð¸Ñ\88аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим. Ð¦Ðµ Ð·Ð¼Ñ\83Ñ\81иÑ\82Ñ\8c ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\96в Ð½Ð°Ð´Ñ\96Ñ\81лаÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f, Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð²Ð¾Ð½Ð¾ дорівнює `None`.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и, Ñ\89о Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶Ðµ Ð¿Ñ\80иймаÑ\82и `None`, Ð°Ð»Ðµ Ð¿Ñ\80и Ñ\86Ñ\8cомÑ\83 Ð·Ð°Ð»Ð¸Ñ\88аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим. Ð¦Ðµ Ð·Ð¼Ñ\83Ñ\81иÑ\82Ñ\8c ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\96в Ð½Ð°Ð´Ñ\96Ñ\81лаÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f, Ð½Ð°Ð²Ñ\96Ñ\82Ñ\8c Ñ\8fкÑ\89о Ð·Ð½Ð°Ñ\87еннÑ\8f дорівнює `None`.
 
-Щоб зробити це, оголосіть, що `None` є допустимим типом, але не вказуйте значення за замовчуванням:
+Щоб Ð·Ñ\80обиÑ\82и Ñ\86е, Ð¾Ð³Ð¾Ð»Ð¾Ñ\81Ñ\96Ñ\82Ñ\8c, Ñ\89о `None` Ñ\94 Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имим Ñ\82ипом, Ð°Ð»Ðµ Ð¿Ñ\80оÑ\81Ñ\82о Ð½Ðµ Ð²ÐºÐ°Ð·Ñ\83йÑ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм:
 
 {* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
 
-## Список параметрів запиту / кілька значень
+## Список query параметрів / кілька значень { #query-parameter-list-multiple-values }
 
¯ÐºÑ\89о Ð\92и Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94Ñ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, Ð\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ð¾Ñ\82Ñ\80иманнÑ\8f Ñ\81пиÑ\81кÑ\83 Ð·Ð½Ð°Ñ\87енÑ\8c, Ñ\82обÑ\82о Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ð¾Ñ\82Ñ\80иманнÑ\8f ÐºÑ\96лÑ\8cкоÑ\85 значень.
\9aоли Ð²Ð¸ Ñ\8fвно Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94Ñ\82е query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `Query`, Ð²Ð¸ Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и, Ñ\89о Ð²Ñ\96н Ð¼Ð°Ñ\94 Ð¿Ñ\80иймаÑ\82и Ñ\81пиÑ\81ок Ð·Ð½Ð°Ñ\87енÑ\8c, Ð°Ð±Ð¾, Ñ\96нÑ\88ими Ñ\81ловами, ÐºÑ\96лÑ\8cка значень.
 
\9dапÑ\80иклад, Ñ\89об Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\83 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 `q` Ð·'Ñ\8fвлÑ\8fÑ\82иÑ\81Ñ\8f ÐºÑ\96лÑ\8cка Ñ\80азÑ\96в Ð² URL, можна написати:
\9dапÑ\80иклад, Ñ\89об Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `q`, Ñ\8fкий Ð¼Ð¾Ð¶Ðµ Ð·â\80\99Ñ\8fвлÑ\8fÑ\82иÑ\81Ñ\8f Ð² URL ÐºÑ\96лÑ\8cка Ñ\80азÑ\96в, можна написати:
 
 {* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
 
-Тоді, у випадку запиту за URL:
+Тоді, у випадку URL:
 
 ```
 http://localhost:8000/items/?q=foo&q=bar
 ```
 
\92и Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е ÐºÑ\96лÑ\8cка Ð·Ð½Ð°Ñ\87енÑ\8c *query Ð¿Ð°Ñ\80амеÑ\82Ñ\80а* `q` (`foo` Ñ\96 `bar`) Ñ\83 Ð²Ð¸Ð³Ð»Ñ\8fдÑ\96 Ñ\81пиÑ\81кÑ\83 `list` Ð² Python Ñ\83 Ð\92аÑ\88Ñ\96й *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð±Ñ\80обки шляху*, у *параметрі функції* `q`.
²Ð¸ Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е ÐºÑ\96лÑ\8cка Ð·Ð½Ð°Ñ\87енÑ\8c `q` *query Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в* (`foo` Ñ\96 `bar`) Ñ\83 Ð²Ð¸Ð³Ð»Ñ\8fдÑ\96 Python `list` Ñ\83 Ð²Ð°Ñ\88Ñ\96й *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 шляху*, у *параметрі функції* `q`.
 
 Отже, відповідь на цей URL буде:
 
@@ -296,9 +279,9 @@ http://localhost:8000/items/?q=foo&q=bar
 }
 ```
 
-/// tip | Підказка
+/// tip | Порада
 
-Щоб оголосити параметр запиту з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
+Щоб оголосити query параметр з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
 
 ///
 
@@ -306,19 +289,19 @@ http://localhost:8000/items/?q=foo&q=bar
 
 <img src="/img/tutorial/query-params-str-validations/image02.png">
 
-### Список параметрів запиту / кілька значень за замовчуванням
+### Список query параметрів / кілька значень за замовчуванням { #query-parameter-list-multiple-values-with-defaults }
 
-Ви також можете визначити значення за замовчуванням для `list`, якщо жодне значення не було передане:
+Ви також можете визначити значення за замовчуванням `list`, якщо жодне значення не було передане:
 
 {* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
 
-ЯкÑ\89о Ð\92и перейдете за посиланням:
+ЯкÑ\89о Ð²и перейдете за посиланням:
 
 ```
 http://localhost:8000/items/
 ```
 
\82о Ð·Ð½Ð°Ñ\87еннÑ\8f `q` Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð±Ñ\83де: `["foo", "bar"]`, Ñ\96 Ð\92аша відповідь виглядатиме так:
\82о Ð·Ð½Ð°Ñ\87еннÑ\8f `q` Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð±Ñ\83де: `["foo", "bar"]`, Ñ\96 Ð²аша відповідь виглядатиме так:
 
 ```JSON
 {
@@ -329,35 +312,35 @@ http://localhost:8000/items/
 }
 ```
 
-#### Використання тільки `list`
+#### Використання тільки `list` { #using-just-list }
 
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `list` Ð±ÐµÐ· Ñ\83Ñ\82оÑ\87неннÑ\8f Ñ\82ипÑ\83, замість `list[str]`:
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и `list` Ð½Ð°Ð¿Ñ\80Ñ\8fмÑ\83 замість `list[str]`:
 
 {* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
 
-/// note | Ð¢ÐµÑ\85нÑ\96Ñ\87нÑ\96 Ð´ÐµÑ\82алÑ\96
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
 Майте на увазі, що в цьому випадку FastAPI не перевірятиме вміст списку.
 
-Наприклад, `list[int]`  перевірятиме (і документуватиме), що всі елементи списку є цілими числами. Але `list` без уточнення цього не робитиме.
+Наприклад, `list[int]` перевірятиме (і документуватиме), що вміст списку — цілі числа. Але `list` без уточнення цього не робитиме.
 
 ///
 
-## Ð\94одаваннÑ\8f Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¼ÐµÑ\82аданиÑ\85
+## Ð\9eголоÑ\81иÑ\82и Ð±Ñ\96лÑ\8cÑ\88е Ð¼ÐµÑ\82аданиÑ\85 { #declare-more-metadata }
 
 Ви можете додати більше інформації про параметр.
 
-Ця інформація буде включена у згенерований OpenAPI та використана в інтерфейсах документації та зовнішніх інструментах.
+Ця інформація буде включена у згенерований OpenAPI та використана інтерфейсами документації та зовнішніми інструментами.
 
-/// note | Ð¢ÐµÑ\85нÑ\96Ñ\87нÑ\96 Ð´ÐµÑ\82алÑ\96
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
 Майте на увазі, що різні інструменти можуть мати різний рівень підтримки OpenAPI.
 
-Деякі з них можуть ще не відображати всю додаткову інформацію, хоча в більшості випадків ця функція вже запланована для розробки.
+Деякі з них можуть ще не відображати всю додаткову інформацію, хоча в більшості випадків відсутню функцію вже заплановано до реалізації.
 
 ///
 
-Ви можете додати `title` :
+Ви можете додати `title`:
 
 {* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *}
 
@@ -365,9 +348,9 @@ http://localhost:8000/items/
 
 {* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *}
 
-## Аліаси параметрів
+## Аліаси параметрів { #alias-parameters }
 
-УÑ\8fвÑ\96Ñ\82Ñ\8c, Ñ\89о Ð\92и хочете, щоб параметр називався `item-query`.
+УÑ\8fвÑ\96Ñ\82Ñ\8c, Ñ\89о Ð²и хочете, щоб параметр називався `item-query`.
 
 Наприклад:
 
@@ -379,19 +362,19 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
 
 Найближчий допустимий варіант — `item_query`.
 
\9fÑ\80оÑ\82е Ð\92ам потрібно, щоб параметр залишався саме `item-query`...
\9fÑ\80оÑ\82е Ð²ам потрібно, щоб параметр залишався саме `item-query`...
 
 У такому випадку можна оголосити `alias`, і саме він буде використовуватися для отримання значення параметра:
 
 {* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *}
 
-## Ð\92иведеннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\8fк Ð·Ð°Ñ\81Ñ\82аÑ\80Ñ\96лиÑ\85
+## Ð\9fознаÑ\87еннÑ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\8fк Ð·Ð°Ñ\81Ñ\82аÑ\80Ñ\96лиÑ\85 { #deprecating-parameters }
 
-Припустимо, що Ви більше не хочете використовувати цей параметр.
+Припустімо, що вам більше не подобається цей параметр.
 
\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð·Ð°Ð»Ð¸Ñ\88иÑ\82и Ð¹Ð¾Ð³Ð¾ Ð½Ð° Ð´ÐµÑ\8fкий Ñ\87аÑ\81, Ð¾Ñ\81кÑ\96лÑ\8cки Ð½Ð¸Ð¼ ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82и, Ð°Ð»Ðµ Ð\92и Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ñ\87Ñ\96Ñ\82ко Ð¿Ð¾ÐºÐ°Ð·Ñ\83вала, Ñ\89о Ð²Ñ\96н Ñ\94 <abbr title="заÑ\81Ñ\82аÑ\80Ñ\96лий, Ð½Ðµ Ñ\80екомендÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f">заÑ\81Ñ\82аÑ\80Ñ\96лим</abbr>.
\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð·Ð°Ð»Ð¸Ñ\88иÑ\82и Ð¹Ð¾Ð³Ð¾ Ð½Ð° Ð´ÐµÑ\8fкий Ñ\87аÑ\81, Ð¾Ñ\81кÑ\96лÑ\8cки Ð½Ð¸Ð¼ ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82и, Ð°Ð»Ðµ Ð²Ð¸ Ñ\85оÑ\87еÑ\82е, Ñ\89об Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8f Ñ\87Ñ\96Ñ\82ко Ð¿Ð¾ÐºÐ°Ð·Ñ\83вала, Ñ\89о Ð²Ñ\96н Ñ\94 <abbr title="obsolete, recommended not to use it â\80\93 Ð·Ð°Ñ\81Ñ\82аÑ\80Ñ\96лий, Ð½Ðµ Ñ\80екомендÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f">deprecated</abbr>.
 
-ТодÑ\96 Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80едаÑ\82и параметр `deprecated=True` до `Query`:
+ТодÑ\96 Ð¿ÐµÑ\80едайÑ\82е параметр `deprecated=True` до `Query`:
 
 {* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *}
 
@@ -399,27 +382,27 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
 
 <img src="/img/tutorial/query-params-str-validations/image01.png">
 
-## Виняток параметрів з OpenAPI
+## Виняток параметрів з OpenAPI { #exclude-parameters-from-openapi }
 
-Щоб виключити параметр запиту зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
+Щоб виключити query параметр зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
 
 {* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
 
-## Кастомна валідація
+## Кастомна валідація { #custom-validation }
 
\9cожÑ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð\92ам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище.
\9cожÑ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð²ам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище.
 
-У таких випадках ви можете використати **кастомну функцію валідації**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
+У таких випадках ви можете використати **кастомну функцію-валідатор**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
 
 Це можна досягти за допомогою <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">Pydantic's `AfterValidator`</a> в середині `Annotated`.
 
-/// tip | Підказка
+/// tip | Порада
 
 Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator" class="external-link" target="_blank">`BeforeValidator`</a> та інші. 🤓
 
 ///
 
-Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги <abbr title="ISBN означає Міжнародний стандартний номер книги">ISBN</abbr> або з `imdb-` для ID URL фільму на <abbr title="IMDB (Internet Movie Database) це вебсайт з інформацією про фільми">IMDB</abbr>:
+Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги <abbr title="ISBN means International Standard Book Number – ISBN означає Міжнародний стандартний номер книги">ISBN</abbr> або з `imdb-` для ID URL фільму на <abbr title="IMDB (Internet Movie Database) is a website with information about movies – IMDB (Internet Movie Database) це вебсайт з інформацією про фільми">IMDB</abbr>:
 
 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
 
@@ -429,49 +412,49 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
 
 ///
 
-/// tip | Підказка
+/// tip | Порада
 
-ЯкÑ\89о Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð±Ñ\83дÑ\8c\8fкÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e, Ñ\8fка Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ\94 Ð²Ð·Ð°Ñ\94модÑ\96Ñ\97 Ð· Ð±Ñ\83дÑ\8c\8fким **зовнÑ\96Ñ\88нÑ\96м ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ\82ом**, Ñ\82аким Ñ\8fк Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð¸Ñ\85 Ñ\87и Ñ\96нÑ\88ий API, Ð²Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ñ\86Ñ\8cого Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и **FastAPI Dependencies**. Ð\92и дізнаєтесь про них пізніше.
+ЯкÑ\89о Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð±Ñ\83дÑ\8c\8fкÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e, Ñ\8fка Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ\94 Ð²Ð·Ð°Ñ\94модÑ\96Ñ\97 Ð· Ð±Ñ\83дÑ\8c\8fким **зовнÑ\96Ñ\88нÑ\96м ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ\82ом**, Ñ\82аким Ñ\8fк Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ð¸Ñ\85 Ñ\87и Ñ\96нÑ\88ий API, Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ñ\86Ñ\8cого Ñ\81лÑ\96д Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и **FastAPI Dependencies** â\80\94 Ð²и дізнаєтесь про них пізніше.
 
-Ці кастомні валідатори використовуються для речей, які можна перевірити лише з **тими даними**, що надані в запиті.
+Ці кастомні валідатори використовуються для речей, які можна перевірити лише з **тіими самими даними**, що надані в запиті.
 
 ///
 
-### Зрозумійте цей код
+### Зрозумійте цей код { #understand-that-code }
 
\93оловний Ð¼Ð¾Ð¼ÐµÐ½Ñ\82 â\80\93 це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸
\93оловний Ð¼Ð¾Ð¼ÐµÐ½Ñ\82 â\80\94 це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸
 
 ---
 
\90ле Ñ\8fкÑ\89о Ð\92ам Ñ\86Ñ\96каво Ñ\80озÑ\96бÑ\80аÑ\82иÑ\81Ñ\8f Ð² Ñ\86Ñ\8cомÑ\83 ÐºÐ¾Ð½ÐºÑ\80еÑ\82номÑ\83 Ð¿Ñ\80икладÑ\96 ÐºÐ¾Ð´Ñ\83 Ñ\96 Ð\92ам ще не набридло, ось кілька додаткових деталей.
\90ле Ñ\8fкÑ\89о Ð²Ð°Ð¼ Ñ\86Ñ\96каво Ñ\80озÑ\96бÑ\80аÑ\82иÑ\81Ñ\8f Ð² Ñ\86Ñ\8cомÑ\83 ÐºÐ¾Ð½ÐºÑ\80еÑ\82номÑ\83 Ð¿Ñ\80икладÑ\96 ÐºÐ¾Ð´Ñ\83 Ñ\96 Ð²ам ще не набридло, ось кілька додаткових деталей.
 
-#### Рядок із `value.startswith()`
+#### Рядок із `value.startswith()` { #string-with-value-startswith }
 
 Звернули увагу? Рядок із `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі:
 
 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
 
-#### Випадковий елемент
+#### Випадковий елемент { #a-random-item }
 
-За допомогою `data.items()` ми отримуємо <abbr title="Об'єкт, який можна перебирати в циклі, як-от список чи множину.">ітерабельний об'єкт</abbr> із кортежами, що містять ключ і значення для кожного елемента словника.
+За допомогою `data.items()` ми отримуємо <abbr title="Something we can iterate on with a for loop, like a list, set, etc. – Об'єкт, який можна перебирати в циклі, як-от список чи множину.">iterable object</abbr> із кортежами, що містять ключ і значення для кожного елемента словника.
 
-Ми перетворюємо цей ітерабельний об'єкт у звичайний `list` за допомогою `list(data.items())`.
+Ми перетворюємо цей iterable object у звичайний `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 елемента, він все одно отримає випадкову рекомендацію.
 
-...і все це реалізовано в **одному рядку коду**. 🤯 Хіба не прекрасний Python? 🐍
+...ми робимо все це в **одному простому рядку**. 🤯 Хіба ви не любите Python? 🐍
 
 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
 
-## Підсумок
+## Підсумок { #recap }
 
-Ви можете оголошувати додаткові валідації та метаінформацію для своїх параметрів.
+Ви можете оголошувати додаткові валідації та метадані для ваших параметрів.
 
-Загальні валідації та метаінформація:
+Загальні валідації та метадані:
 
 * `alias`
 * `title`
@@ -486,6 +469,6 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
 
 Кастомні валідації за допомогою `AfterValidator`.
 
-У Ñ\86иÑ\85 Ð¿Ñ\80икладаÑ\85 Ð\92и побачили, як оголошувати валідації для значень `str`.
+У Ñ\86иÑ\85 Ð¿Ñ\80икладаÑ\85 Ð²и побачили, як оголошувати валідації для значень `str`.
 
 Дивіться наступні розділи, щоб дізнатися, як оголошувати валідації для інших типів, наприклад чисел.
index 4b75ecab9ab6f58e31da9a64089b2808d8b4de6d..a9068aa8f99ea94455ebfcb9cc7fc27d2d8d6232 100644 (file)
@@ -1,10 +1,10 @@
-# Query Ð\9fаÑ\80амеÑ\82Ñ\80и
+# Query Ð¿Ð°Ñ\80амеÑ\82Ñ\80и { #query-parameters }
 
\9aоли Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ñ\96нÑ\88Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\8fкÑ\96 Ð½Ðµ Ñ\94 Ñ\87аÑ\81Ñ\82иноÑ\8e Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\88лÑ\8fÑ\85Ñ\83, Ð²Ð¾Ð½Ð¸ Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ñ\96нÑ\82еÑ\80пÑ\80еÑ\82Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ñ\8fк "query" Ð¿Ð°Ñ\80амеÑ\82Ñ\80и.
\9aоли Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ñ\96нÑ\88Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\8fкÑ\96 Ð½Ðµ Ñ\94 Ñ\87аÑ\81Ñ\82иноÑ\8e Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в Ñ\88лÑ\8fÑ\85Ñ\83, Ð²Ð¾Ð½Ð¸ Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ñ\96нÑ\82еÑ\80пÑ\80еÑ\82Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ñ\8fк Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Â«query».
 
-{* ../../docs_src/query_params/tutorial001.py hl[9] *}
+{* ../../docs_src/query_params/tutorial001_py39.py hl[9] *}
 
-Query параметри — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
+Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
 
 Наприклад, в URL:
 
@@ -12,41 +12,41 @@ Query параметри — це набір пар ключ-значення, 
 http://127.0.0.1:8000/items/?skip=0&limit=10
 ```
 
-...query параметрами є:
+...параметрами query є:
 
 * `skip`: зі значенням `0`
 * `limit`: зі значенням `10`
 
-Оскільки вони є частиною URL, вони "за замовчуванням" є рядками.
+Оскільки вони є частиною URL, вони «природно» є рядками.
 
\90ле ÐºÐ¾Ð»Ð¸ Ð\92и оголошуєте їх із типами Python (у наведеному прикладі як `int`), вони перетворюються на цей тип і проходять перевірку відповідності.
\90ле ÐºÐ¾Ð»Ð¸ Ð²и оголошуєте їх із типами Python (у наведеному прикладі як `int`), вони перетворюються на цей тип і проходять перевірку відповідності.
 
-Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до query параметрів:
+Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів query:
 
-* Ð\9fÑ\96дÑ\82Ñ\80имка Ð² Ñ\80едакÑ\82оÑ\80Ñ\96 (авÑ\82одоповненнÑ\8f, Ð¿ÐµÑ\80евÑ\96Ñ\80ка Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº)
-* <abbr title="перетворення рядка, що надходить з HTTP-запиту, у типи даних Python">"Парсинг"</abbr> даних
+* Ð\9fÑ\96дÑ\82Ñ\80имка Ð² Ñ\80едакÑ\82оÑ\80Ñ\96 (оÑ\87евидно)
+* <abbr title="converting the string that comes from an HTTP request into Python data – перетворення рядка, що надходить з HTTP-запиту, у дані Python">«parsing»</abbr> даних
 * Валідація даних
 * Автоматична документація
 
+## Значення за замовчуванням { #defaults }
 
-## Значення за замовчуванням
-
-Оскільки query параметри не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
+Оскільки параметри query не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
 
 У наведеному вище прикладі вони мають значення за замовчуванням: `skip=0` і `limit=10`.
 
-Отже, результат переходу за URL:
+Отже, перехід за URL:
 
 ```
 http://127.0.0.1:8000/items/
 ```
+
 буде таким самим, як і перехід за посиланням:
 
 ```
 http://127.0.0.1:8000/items/?skip=0&limit=10
 ```
 
\90ле Ñ\8fкÑ\89о Ð\92и перейдете, наприклад, за посиланням:
\90ле Ñ\8fкÑ\89о Ð²и перейдете, наприклад, за посиланням:
 
 ```
 http://127.0.0.1:8000/items/?skip=20
@@ -54,12 +54,12 @@ http://127.0.0.1:8000/items/?skip=20
 
 Значення параметрів у вашій функції будуть такими:
 
-* `skip=20`: Ð¾Ñ\81кÑ\96лÑ\8cки Ð\92и вказали його в URL
+* `skip=20`: Ð¾Ñ\81кÑ\96лÑ\8cки Ð²и вказали його в URL
 * `limit=10`: оскільки це значення за замовчуванням
 
-## Необов'язкові параметри
+## Необов'язкові параметри { #optional-parameters }
 
\90налогÑ\96Ñ\87но, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковÑ\96 query Ð¿Ð°Ñ\80амеÑ\82Ñ\80и, встановивши для них значення за замовчуванням `None`:
¢Ð°Ðº Ñ\81амо Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и query, встановивши для них значення за замовчуванням `None`:
 
 {* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
 
@@ -67,18 +67,17 @@ http://127.0.0.1:8000/items/?skip=20
 
 /// check | Примітка
 
-Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це query параметр.
+Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
 
 ///
 
-## Перетворення типу Query параметра
+## Перетворення типу параметра query { #query-parameter-type-conversion }
 
 Ви також можете оголошувати параметри типу `bool`, і вони будуть автоматично конвертовані:
 
 {* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
 
-У цьому випадку, якщо Ви звернетесь до:
-
+У цьому випадку, якщо ви перейдете за:
 
 ```
 http://127.0.0.1:8000/items/foo?short=1
@@ -108,38 +107,38 @@ 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 параметрів
 
-Ви можете одночасно оголошувати кілька path і query параметрів, і **FastAPI** автоматично визначить, який з них до чого належить.
+## Кілька path і query параметрів { #multiple-path-and-query-parameters }
 
+Ви можете одночасно оголошувати кілька параметрів шляху та параметрів query, **FastAPI** знає, який з них який.
 
\9dе Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð´Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82иÑ\81Ñ\8c Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ñ\80Ñ\8fдкÑ\83 Ñ\97Ñ\85 Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f.
\86 Ð²Ð°Ð¼ Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ñ\97Ñ\85 Ñ\83 Ñ\8fкомÑ\83Ñ\81Ñ\8c ÐºÐ¾Ð½ÐºÑ\80еÑ\82номÑ\83 Ð¿Ð¾Ñ\80Ñ\8fдкÑ\83.
 
 Вони визначаються за назвою:
 
 {* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
 
-## Обов’язкові Query параметри
+## Обов’язкові параметри query { #required-query-parameters }
 
¯ÐºÑ\89о Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð´Ð»Ñ\8f Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в, Ñ\8fкÑ\96 Ð½Ðµ Ñ\94 path-паÑ\80амеÑ\82Ñ\80ами (Ñ\83 Ñ\86Ñ\8cомÑ\83 Ñ\80оздÑ\96лÑ\96 Ð¼Ð¸ Ð±Ð°Ñ\87или Ð¿Ð¾ÐºÐ¸ Ñ\89о Ð»Ð¸Ñ\88е path Ð¿Ð°Ñ\80амеÑ\82Ñ\80и), Ñ\82одÑ\96 Ð²Ð¾Ð½Ð¸ Ñ\81Ñ\82аÑ\8eÑ\82Ñ\8c Ð½Ðµобов’язковими.
\9aоли Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм Ð´Ð»Ñ\8f Ð½Ðµ-path-паÑ\80амеÑ\82Ñ\80Ñ\96в (поки Ñ\89о Ð¼Ð¸ Ð±Ð°Ñ\87или Ð»Ð¸Ñ\88е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и query), Ñ\82одÑ\96 Ð²Ð¾Ð½Ð¸ Ð½Ðµ Ñ\94 обов’язковими.
 
-ЯкÑ\89о Ð\92и Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð²ÐºÐ°Ð·Ñ\83ваÑ\82и ÐºÐ¾Ð½ÐºÑ\80еÑ\82нÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f, Ð°Ð»Ðµ Ñ\85оÑ\87еÑ\82е Ð·Ñ\80обиÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¾Ð¿Ñ\86Ñ\96оналÑ\8cним, задайте `None` як значення за замовчуванням.
+ЯкÑ\89о Ð²Ð¸ Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð·Ð°Ð´Ð°Ð²Ð°Ñ\82и ÐºÐ¾Ð½ÐºÑ\80еÑ\82не Ð·Ð½Ð°Ñ\87еннÑ\8f, Ð° Ð¿Ñ\80оÑ\81Ñ\82о Ð·Ñ\80обиÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, задайте `None` як значення за замовчуванням.
 
\90ле Ñ\8fкÑ\89о Ð\92и Ñ\85оÑ\87еÑ\82е Ð·Ñ\80обиÑ\82и query Ð¿Ð°Ñ\80амеÑ\82Ñ\80 обов’язковим, просто не вказуйте для нього значення за замовчуванням:
\90ле Ñ\8fкÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð·Ñ\80обиÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 query обов’язковим, просто не вказуйте для нього значення за замовчуванням:
 
-{* ../../docs_src/query_params/tutorial005.py hl[6:7] *}
+{* ../../docs_src/query_params/tutorial005_py39.py hl[6:7] *}
 
-Тут `needy` – обов’язковий query параметр типу `str`.
+Тут параметр query `needy` — обов’язковий параметр query типу `str`.
 
-ЯкÑ\89о Ð\92и відкриєте у браузері URL-адресу:
+ЯкÑ\89о Ð²и відкриєте у браузері URL-адресу:
 
 ```
 http://127.0.0.1:8000/items/foo-item
 ```
 
-...без Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ\8f Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзкового Ð¿Ð°Ñ\80амеÑ\82Ñ\80а `needy`, Ð\92и Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83:
+...без Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ\8f Ð¾Ð±Ð¾Ð²â\80\99Ñ\8fзкового Ð¿Ð°Ñ\80амеÑ\82Ñ\80а `needy`, Ð²Ð¸ Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 Ð½Ð° ÐºÑ\88Ñ\82алÑ\82:
 
 ```JSON
 {
@@ -163,7 +162,7 @@ http://127.0.0.1:8000/items/foo-item
 http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
 ```
 
-...цей запит поверне:
+...це спрацює:
 
 ```JSON
 {
@@ -172,20 +171,18 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
 }
 ```
 
-
-Звичайно, Ви можете визначити деякі параметри як обов’язкові, інші зі значенням за замовчуванням, а ще деякі — повністю опціональні:
+І звісно, ви можете визначити деякі параметри як обов’язкові, деякі — зі значенням за замовчуванням, а деякі — повністю необов’язкові:
 
 {* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
 
-У цьому випадку є 3 query параметри:
+У цьому випадку є 3 параметри query:
 
 * `needy`, обов’язковий `str`.
 * `skip`, `int` зі значенням за замовчуванням `0`.
-* `limit`, опціональний `int`.
-
+* `limit`, необов’язковий `int`.
 
-/// tip | Підказка
+/// tip | Порада
 
-Ви також можете використовувати `Enum`-и, так само як і з [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
+Ви також можете використовувати `Enum` так само, як і з [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
 
 ///
index 18b7cc01c9dd507114dc6b4760da828fe6e18a01..a6ff70dc097dc7a3c9d1876558c86912ccdaaa63 100644 (file)
@@ -1,56 +1,56 @@
-# Запит файлів
+# Запит файлів { #request-files }
 
 Ви можете визначити файли, які будуть завантажуватися клієнтом, використовуючи `File`.
 
 /// info | Інформація
 
-Щоб отримувати завантажені файли, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">python-multipart</a>.
+Щоб отримувати завантажені файли, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾ Ñ\82а встановили пакет, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²Ð¸ Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м встановили пакет, наприклад:
 
 ```console
 $ pip install python-multipart
 ```
 
-Це необхідно, оскільки завантажені файли передаються у вигляді "форматованих даних форми".
+Це необхідно, оскільки завантажені файли передаються у вигляді «form data».
 
 ///
 
-## Імпорт `File`
+## Імпорт `File` { #import-file }
 
 Імпортуйте `File` та `UploadFile` з `fastapi`:
 
 {* ../../docs_src/request_files/tutorial001_an_py39.py hl[3] *}
 
-## Визначення параметрів `File`
+## Визначення параметрів `File` { #define-file-parameters }
 
-СÑ\82воÑ\80Ñ\96Ñ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84айлÑ\96в Ñ\82ак Ñ\81амо Ñ\8fк Ð\92и б створювали `Body` або `Form`:
+СÑ\82воÑ\80Ñ\96Ñ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84айлÑ\96в Ñ\82ак Ñ\81амо Ñ\8fк Ð²и б створювали `Body` або `Form`:
 
 {* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *}
 
 /// info | Інформація
 
-`File`  — це клас, який безпосередньо успадковує `Form`.
+`File` — це клас, який безпосередньо успадковує `Form`.
 
\90ле Ð¿Ð°Ð¼â\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о ÐºÐ¾Ð»Ð¸ Ð\92и імпортуєте `Query`, `Path`, `File` та інші з `fastapi`, це насправді функції, які повертають спеціальні класи.
\90ле Ð¿Ð°Ð¼â\80\99Ñ\8fÑ\82айÑ\82е, Ñ\89о ÐºÐ¾Ð»Ð¸ Ð²и імпортуєте `Query`, `Path`, `File` та інші з `fastapi`, це насправді функції, які повертають спеціальні класи.
 
 ///
 
-/// tip | Підказка
+/// tip | Порада
 
-Щоб Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ñ\82Ñ\96ла Ñ\84айлÑ\96в, Ð\92ам потрібно використовувати `File`, тому що інакше параметри будуть інтерпретовані як параметри запиту або параметри тіла (JSON).
+Щоб Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ñ\82Ñ\96ла Ñ\84айлÑ\96в, Ð²ам потрібно використовувати `File`, тому що інакше параметри будуть інтерпретовані як параметри запиту або параметри тіла (JSON).
 
 ///
 
-Файли будуть завантажені у вигляді "форматованих даних форми".
+Файли будуть завантажені у вигляді «form data».
 
-ЯкÑ\89о Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82е Ñ\82ип Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð±Ñ\80обника Ð¼Ð°Ñ\80Ñ\88Ñ\80Ñ\83Ñ\82Ñ\83 Ñ\8fк `bytes`, **FastAPI** Ð¿Ñ\80оÑ\87иÑ\82аÑ\94 Ñ\84айл Ð·Ð° Ð\92аÑ\81, Ñ\96 Ð\92и отримаєте його вміст у вигляді `bytes`.
+ЯкÑ\89о Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82е Ñ\82ип Ð¿Ð°Ñ\80амеÑ\82Ñ\80а *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ñ\8fк `bytes`, **FastAPI** Ð¿Ñ\80оÑ\87иÑ\82аÑ\94 Ñ\84айл Ð·Ð° Ð²Ð°Ñ\81, Ñ\96 Ð²и отримаєте його вміст у вигляді `bytes`.
 
\9eднак Ð¼Ð°Ð¹Ñ\82е Ð½Ð° Ñ\83вазÑ\96, що весь вміст буде збережено в пам'яті. Це працюватиме добре для малих файлів.
\9cайÑ\82е Ð½Ð° Ñ\83вазÑ\96, Ñ\89о Ñ\86е Ð¾Ð·Ð½Ð°Ñ\87аÑ\94, що весь вміст буде збережено в пам'яті. Це працюватиме добре для малих файлів.
 
-Але в деяких випадках Вам може знадобитися `UploadFile`.
+Але є кілька випадків, у яких вам може бути корисно використовувати `UploadFile`.
 
-## Параметри файлу з `UploadFile`
+## Параметри файлу з `UploadFile` { #file-parameters-with-uploadfile }
 
 Визначте параметр файлу з типом `UploadFile`:
 
@@ -59,38 +59,39 @@ $ pip install python-multipart
 Використання `UploadFile` має кілька переваг перед `bytes`:
 
 * Вам не потрібно використовувати `File()` у значенні за замовчуванням параметра.
-* Використовується "буферизований" файл:
-    * Ð¤Ð°Ð¹Ð» Ð·Ð±ÐµÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð² Ð¿Ð°Ð¼'Ñ\8fÑ\82Ñ\96 Ð´Ð¾ Ð´Ð¾Ñ\81Ñ\8fгненнÑ\8f Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f, Ð¿Ñ\96Ñ\81лÑ\8f Ñ\87ого Ð²Ñ\96н Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ð´Ð¸Ñ\81к.
-* Це означає, що він добре працює для великих файлів, таких як зображення, відео, великі двійкові файли тощо, не споживаючи всю пам'ять.
-Ви можете отримати метадані про завантажений файл.
-* Він має <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> `асинхронний файловий інтерфейс` interface.
-* Він надає фактичний об'єкт Python <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a>, який можна передавати безпосередньо іншим бібліотекам.
+* Використовується «spooled» файл:
+    * Ð¤Ð°Ð¹Ð» Ð·Ð±ÐµÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð² Ð¿Ð°Ð¼'Ñ\8fÑ\82Ñ\96 Ð´Ð¾ Ð´Ð¾Ñ\81Ñ\8fгненнÑ\8f Ð¼Ð°ÐºÑ\81ималÑ\8cного Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f Ñ\80озмÑ\96Ñ\80Ñ\83, Ð¿Ñ\96Ñ\81лÑ\8f Ñ\87ого Ð²Ñ\96н Ð±Ñ\83де Ð·Ð±ÐµÑ\80ежений Ð½Ð° Ð´Ð¸Ñ\81кÑ\83.
+* Це означає, що він добре працюватиме для великих файлів, таких як зображення, відео, великі двійкові файли тощо, не споживаючи всю пам'ять.
+Ви можете отримати метадані про завантажений файл.
+* Він має <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> `async` інтерфейс.
+* Він надає фактичний об'єкт Python <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a>, який можна передавати безпосередньо іншим бібліотекам, що очікують file-like об'єкт.
 
-### `UploadFile`
+### `UploadFile` { #uploadfile }
 
 `UploadFile` має такі атрибути:
 
 * `filename`: Рядок `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`).
-* `content_type`: Рядок `str` з MIME-типом (наприклад, `image/jpeg`).
-* `file`: Об'єкт <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">SpooledTemporaryFile</a> (<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">файлоподібний</a> об'єкт). Це фактичний файловий об'єкт Python, який можна безпосередньо передавати іншим функціям або бібліотекам, що очікують "файлоподібний" об'єкт.
+* `content_type`: Рядок `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`).
+* `file`: <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт.
 
-`UploadFile` має такі асинхронні `async` методи. Вони викликають відповідні методи файлу під капотом (використовуючи внутрішній `SpooledTemporaryFile`).
+`UploadFile` має такі асинхронні `async` методи. Вони всі викликають відповідні методи файлу під капотом (використовуючи внутрішній `SpooledTemporaryFile`).
 
 * `write(data)`: Записує `data` (`str` або `bytes`) у файл.
 * `read(size)`: Читає `size` (`int`) байтів/символів з файлу.
-* `seek(offset)`: Переміщується до позиції `offset` (`int`) у файлі.
-    * Ð\9dапÑ\80иклад, `await myfile.seek(0)` Ð¿Ð¾Ð²ÐµÑ\80не ÐºÑ\83Ñ\80Ñ\81оÑ\80 на початок файлу.
-    * This is especially useful if you run `await myfile.read()` once and then need to read the contents again. Це особливо корисно, якщо Ви виконуєте await `await myfile.read()` один раз, а потім потрібно знову прочитати вміст.
+* `seek(offset)`: Переходить до байтової позиції `offset` (`int`) у файлі.
+    * Ð\9dапÑ\80иклад, `await myfile.seek(0)` Ð¿ÐµÑ\80ейде на початок файлу.
+    * Це особливо корисно, якщо ви виконаєте `await myfile.read()` один раз, а потім потрібно знову прочитати вміст.
 * `close()`: Закриває файл.
 
-Оскільки всі ці методи є асинхронними `async`, Вам потрібно використовувати "await":
+Оскільки всі ці методи є асинхронними `async` методами, вам потрібно їх «await»-ити.
 
\9dапÑ\80иклад, Ð²Ñ\81еÑ\80единÑ\96 `async` *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð±Ñ\80обки Ñ\88лÑ\8fÑ\85Ñ\83* Ð\92и можете отримати вміст за допомогою:
\9dапÑ\80иклад, Ð²Ñ\81еÑ\80единÑ\96 `async` *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð²и можете отримати вміст за допомогою:
 
 ```Python
 contents = await myfile.read()
 ```
-Якщо Ви знаходитесь у звичайній `def` *функції обробки шляху*, Ви можете отримати доступ до `UploadFile.file` безпосередньо, наприклад:
+
+Якщо ви знаходитесь у звичайній `def` *функції операції шляху*, ви можете отримати доступ до `UploadFile.file` безпосередньо, наприклад:
 
 ```Python
 contents = myfile.file.read()
@@ -98,57 +99,57 @@ contents = myfile.file.read()
 
 /// note | Технічні деталі `async`
 
\9aоли Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `async` Ð¼ÐµÑ\82оди, **FastAPI** Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\94 Ñ\84айловÑ\96 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\83 Ð¿Ñ\83лÑ\96 Ð¿Ð¾Ñ\82окÑ\96в Ñ\82а Ð¾Ñ\87Ñ\96кÑ\83Ñ\94 Ñ\97Ñ\85 Ð·Ð°Ð²ÐµÑ\80Ñ\88еннÑ\8f.
\9aоли Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `async` Ð¼ÐµÑ\82оди, **FastAPI** Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\94 Ñ\84айловÑ\96 Ð¼ÐµÑ\82оди Ñ\83 Ð¿Ñ\83лÑ\96 Ð¿Ð¾Ñ\82окÑ\96в Ñ\96 Ð¾Ñ\87Ñ\96кÑ\83Ñ\94 Ð½Ð° Ð½Ð¸Ñ\85.
 
 ///
 
 /// note | Технічні деталі Starlette
 
-`UploadFile` у **FastAPI** успадковується безпосередньо від `UploadFile` у **Starlette**, але додає деякі необхідні частини, щоб зробити його сумісним із **Pydantic** та іншими компонентами FastAPI.
+`UploadFile` у **FastAPI** успадковується безпосередньо від `UploadFile` у **Starlette**, але додає деякі необхідні частини, щоб зробити його сумісним із **Pydantic** та іншими частинами FastAPI.
 
 ///
 
-## Що таке "Form Data"
+## Що таке «Form Data» { #what-is-form-data }
 
-Спосіб, у який HTML-форми (`<form></form>`) надсилають дані на сервер, зазвичай використовує "спеціальне" кодування, відмінне від JSON.
+Спосіб, у який HTML-форми (`<form></form>`) надсилають дані на сервер, зазвичай використовує «спеціальне» кодування для цих даних, відмінне від JSON.
 
-**FastAPI**  забезпечує правильне зчитування цих даних з відповідної частини запиту, а не з JSON.
+**FastAPI** забезпечить зчитування цих даних з правильного місця, а не з JSON.
 
 /// note | Технічні деталі
 
-Дані з форм зазвичай кодуються за допомогою "media type" `application/x-www-form-urlencoded`, якщо вони не містять файлів.
+Дані з форм зазвичай кодуються за допомогою «media type» `application/x-www-form-urlencoded`, якщо вони не містять файлів.
 
\90ле Ñ\8fкÑ\89о Ñ\84оÑ\80ма Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\84айли, Ð²Ð¾Ð½Ð° ÐºÐ¾Ð´Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ñ\84оÑ\80маÑ\82Ñ\96 `multipart/form-data`. Ð¯ÐºÑ\89о Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `File`, **FastAPI**  Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82Ñ\8c, Ñ\89о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имаÑ\82и Ñ\84айли Ð· Ð²Ñ\96дповÑ\96дноÑ\97 Ñ\87аÑ\81Ñ\82ини Ñ\82Ñ\96ла Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83.
\90ле Ñ\8fкÑ\89о Ñ\84оÑ\80ма Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\84айли, Ð²Ð¾Ð½Ð° ÐºÐ¾Ð´Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\8fк `multipart/form-data`. Ð¯ÐºÑ\89о Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е `File`, **FastAPI** Ð·Ð½Ð°Ñ\82име, Ñ\89о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имаÑ\82и Ñ\84айли Ð· Ð¿Ñ\80авилÑ\8cноÑ\97 Ñ\87аÑ\81Ñ\82ини Ñ\82Ñ\96ла.
 
©Ð¾Ð± Ð´Ñ\96знаÑ\82иÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ñ\86Ñ\96 Ñ\82ипи ÐºÐ¾Ð´Ñ\83ваннÑ\8f Ñ\82а Ñ\84оÑ\80мовÑ\96 Ð¿Ð¾Ð»Ñ\8f, Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ñ\82еÑ\81Ñ\8f Ð· <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">докÑ\83менÑ\82аÑ\86Ñ\96Ñ\94Ñ\8e MDN</abbr> Ñ\89одо <code>POST</code></a>.
¯ÐºÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð´Ñ\96знаÑ\82иÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ñ\86Ñ\96 Ñ\82ипи ÐºÐ¾Ð´Ñ\83ваннÑ\8f Ñ\82а Ñ\84оÑ\80мовÑ\96 Ð¿Ð¾Ð»Ñ\8f, Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ñ\82еÑ\81Ñ\8f Ð· <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> web docs Ð´Ð»Ñ\8f <code>POST</code></a>.
 
 ///
 
-/// warning | Ð£Ð²Ð°Ð³Ð°
+/// warning | Ð\9fопеÑ\80едженнÑ\8f
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и ÐºÑ\96лÑ\8cка Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в `File` Ñ\96 `Form` Ð² *опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*, Ð°Ð»Ðµ Ð\92и Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð´Ð½Ð¾Ñ\87аÑ\81но Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¿Ð¾Ð»Ñ\8f `Body`, Ñ\8fкÑ\96 Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð½Ð°Ð´Ñ\85одиÑ\82и Ñ\83 Ñ\84оÑ\80маÑ\82Ñ\96 JSON, Ð¾Ñ\81кÑ\96лÑ\8cки Ñ\82Ñ\96ло Ð·Ð°Ð¿Ð¸Ñ\82Ñ\83 Ð±Ñ\83де Ð·Ð°ÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ðµ Ñ\83 Ñ\84оÑ\80маÑ\82Ñ\96 `multipart/form-data`, а не `application/json`.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и ÐºÑ\96лÑ\8cка Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\96в `File` Ñ\96 `Form` Ð² *опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*, Ð°Ð»Ðµ Ð²Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð´Ð½Ð¾Ñ\87аÑ\81но Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83ваÑ\82и Ð¿Ð¾Ð»Ñ\8f `Body`, Ñ\8fкÑ\96 Ð²Ð¸ Ð¾Ñ\87Ñ\96кÑ\83Ñ\94Ñ\82е Ð¾Ñ\82Ñ\80имаÑ\82и Ñ\8fк JSON, Ð¾Ñ\81кÑ\96лÑ\8cки Ð·Ð°Ð¿Ð¸Ñ\82 Ð¼Ð°Ñ\82име Ñ\82Ñ\96ло, Ð·Ð°ÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ðµ Ñ\8fк `multipart/form-data`, а не `application/json`.
 
-Це не обмеження **FastAPI**, а особливість протоколу HTTP.
+Це не обмеження **FastAPI**, а частина протоколу HTTP.
 
 ///
 
-## Ð\9eпÑ\86Ñ\96оналÑ\8cне Ð\97аванÑ\82аженнÑ\8f Ð¤Ð°Ð¹Ð»Ñ\96в
+## Ð\9dеобовâ\80\99Ñ\8fзкове Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ñ\84айлÑ\83 { #optional-file-upload }
 
¤Ð°Ð¹Ð» Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\80обиÑ\82и Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в Ñ\96 Ð²Ñ\81Ñ\82ановлÑ\8eÑ\8eÑ\87и значення за замовчуванням `None`:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ñ\80обиÑ\82и Ñ\84айл Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковим, Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\96 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в Ñ\96 Ð²Ñ\81Ñ\82ановивÑ\88и значення за замовчуванням `None`:
 
 {* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *}
 
-## `UploadFile` Ñ\96з Ð\94одаÑ\82ковими Ð\9cеÑ\82а Ð\94аними
+## `UploadFile` Ñ\96з Ð´Ð¾Ð´Ð°Ñ\82ковими Ð¼ÐµÑ\82аданими { #uploadfile-with-additional-metadata }
 
-Ви також можете використовувати `File()` разом із `UploadFile`, наприклад, для встановлення додаткових метаданих:
+Ви також можете використовувати `File()` разом із `UploadFile`, наприклад, щоб встановити додаткові метадані:
 
 {* ../../docs_src/request_files/tutorial001_03_an_py39.py hl[9,15] *}
 
-## Ð\97аванÑ\82аженнÑ\8f Ð\9aÑ\96лÑ\8cкоÑ\85 Ð¤Ð°Ð¹Ð»Ñ\96в
+## Ð\97аванÑ\82аженнÑ\8f ÐºÑ\96лÑ\8cкоÑ\85 Ñ\84айлÑ\96в { #multiple-file-uploads }
 
 Можна завантажувати кілька файлів одночасно.
 
-Вони будуть пов’язані з одним і тим самим "form field", який передається у вигляді "form data".
+Вони будуть пов’язані з одним і тим самим «form field», який передається у вигляді «form data».
 
 Щоб це реалізувати, потрібно оголосити список `bytes` або `UploadFile`:
 
@@ -160,16 +161,16 @@ contents = myfile.file.read()
 
 Ви також можете використати `from starlette.responses import HTMLResponse`.
 
-**FastAPI**  надає ті ж самі `starlette.responses`, що й `fastapi.responses`, для зручності розробників. Однак більшість доступних відповідей надходять безпосередньо від Starlette.
+**FastAPI** надає ті ж самі `starlette.responses`, що й `fastapi.responses`, просто для зручності для вас, розробника. Але більшість доступних відповідей надходять безпосередньо від Starlette.
 
 ///
 
-### Ð\97аванÑ\82аженнÑ\8f Ð´ÐµÐºÑ\96лÑ\8cкоÑ\85 Ñ\84айлÑ\96в Ñ\96з Ð´Ð¾Ð´Ð°Ñ\82ковими Ð¼ÐµÑ\82аданими
+### Ð\97аванÑ\82аженнÑ\8f ÐºÑ\96лÑ\8cкоÑ\85 Ñ\84айлÑ\96в Ñ\96з Ð´Ð¾Ð´Ð°Ñ\82ковими Ð¼ÐµÑ\82аданими { #multiple-file-uploads-with-additional-metadata }
 
-Так Ñ\81амо Ñ\8fк Ñ\96 Ñ\80анÑ\96Ñ\88е, Ð\92и можете використовувати `File()`, щоб встановити додаткові параметри навіть для `UploadFile`:
+Так Ñ\81амо Ñ\8fк Ñ\96 Ñ\80анÑ\96Ñ\88е, Ð²и можете використовувати `File()`, щоб встановити додаткові параметри навіть для `UploadFile`:
 
 {* ../../docs_src/request_files/tutorial003_an_py39.py hl[11,18:20] *}
 
-## Підсумок
+## Підсумок { #recap }
 
-Використовуйте `File`, `bytes`та `UploadFile`, щоб оголошувати файли для завантаження у запитах, які надсилаються у вигляді form data.
+Використовуйте `File`, `bytes` та `UploadFile`, щоб оголошувати файли для завантаження в запиті, надіслані у вигляді form data.
index 7f5759e79a7af872ba368b3f8d1897a7553ff3e6..1bfd368d603d212fe30efdbc7c9b65e8bec60bce 100644 (file)
@@ -1,12 +1,12 @@
-# Моделі форм (Form Models)
+# Моделі форм { #form-models }
 
-У FastAPI Ð\92и можете використовувати **Pydantic-моделі** для оголошення **полів форми**.
+У FastAPI Ð²и можете використовувати **Pydantic-моделі** для оголошення **полів форми**.
 
 /// info | Інформація
 
-Щоб використовувати форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">python-multipart</a>.
+Щоб використовувати форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð²Ñ\81Ñ\82ановили Ð±Ñ\96блÑ\96оÑ\82екÑ\83, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²Ð¸ Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð²Ñ\81Ñ\82ановили Ð¹Ð¾Ð³Ð¾, наприклад:
 
 ```console
 $ pip install python-multipart
@@ -14,21 +14,21 @@ $ pip install python-multipart
 
 ///
 
-/// note | Ð\9fÑ\96дказка
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
я функція підтримується, починаючи з FastAPI версії `0.113.0`. 🤓
е підтримується, починаючи з FastAPI версії `0.113.0`. 🤓
 
 ///
 
-## Використання Pydantic-моделей для форм
+## Pydantic-моделі для форм { #pydantic-models-for-forms }
 
\92ам Ð¿Ñ\80оÑ\81Ñ\82о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и **Pydantic-моделÑ\8c** Ð· Ð¿Ð¾Ð»Ñ\8fми, Ñ\8fкÑ\96 Ð\92и хочете отримати як **поля форми**, а потім оголосити параметр як `Form`:
\92ам Ð¿Ñ\80оÑ\81Ñ\82о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и **Pydantic-моделÑ\8c** Ð· Ð¿Ð¾Ð»Ñ\8fми, Ñ\8fкÑ\96 Ð²и хочете отримати як **поля форми**, а потім оголосити параметр як `Form`:
 
 {* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
 
-**FastAPI**  **виÑ\82Ñ\8fгне** Ð´Ð°Ð½Ñ\96 Ð´Ð»Ñ\8f **кожного Ð¿Ð¾Ð»Ñ\8f** Ð· **Ñ\84оÑ\80мовиÑ\85 Ð´Ð°Ð½Ð¸Ñ\85** Ñ\83 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96 Ñ\82а Ð½Ð°Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð¼ Pydantic-моделÑ\8c, Ñ\8fкÑ\83 Ð\92и визначили.
+**FastAPI**  **виÑ\82Ñ\8fгне** Ð´Ð°Ð½Ñ\96 Ð´Ð»Ñ\8f **кожного Ð¿Ð¾Ð»Ñ\8f** Ð· **Ñ\84оÑ\80мовиÑ\85 Ð´Ð°Ð½Ð¸Ñ\85** Ñ\83 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96 Ñ\82а Ð½Ð°Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð¼ Pydantic-моделÑ\8c, Ñ\8fкÑ\83 Ð²и визначили.
 
-## Перевірка документації
+## Перевірте документацію { #check-the-docs }
 
 Ви можете перевірити це в UI документації за `/docs`:
 
@@ -36,13 +36,13 @@ $ pip install python-multipart
 <img src="/img/tutorial/request-form-models/image01.png">
 </div>
 
-## Заборона додаткових полів форми
+## Забороніть додаткові поля форми { #forbid-extra-form-fields }
 
-У деяких особливих випадках (ймовірно, рідко) Ви можете **обмежити** форму лише тими полями, які були оголошені в Pydantic-моделі, і **заборонити** будь-які **додаткові** поля.
+У деяких особливих випадках (ймовірно, не дуже поширених) ви можете **обмежити** поля форми лише тими, які були оголошені в Pydantic-моделі. І **заборонити** будь-які **додаткові** поля.
 
-/// note | Ð\9fÑ\96дказка
+/// note | Ð\9fÑ\80имÑ\96Ñ\82ка
 
я функція підтримується, починаючи з FastAPI версії `0.114.0`. 🤓
е підтримується, починаючи з FastAPI версії `0.114.0`. 🤓
 
 ///
 
@@ -52,7 +52,7 @@ $ pip install python-multipart
 
 Якщо клієнт спробує надіслати додаткові дані, він отримає **відповідь з помилкою**.
 
\9dапÑ\80иклад, Ñ\8fкÑ\89о ÐºÐ»Ñ\96Ñ\94нÑ\82 Ñ\81пÑ\80обÑ\83Ñ\94 Ð½Ð°Ð´Ñ\96Ñ\81лаÑ\82и Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\96 Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми:
+Наприклад, якщо клієнт спробує надіслати поля форми:
 
 * `username`: `Rick`
 * `password`: `Portal Gun`
@@ -73,6 +73,6 @@ $ pip install python-multipart
 }
 ```
 
-## Підсумок
+## Підсумок { #summary }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Pydantic-моделÑ\96 Ð´Ð»Ñ\8f Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ð¿Ð¾Ð»Ñ\96в Ñ\84оÑ\80ми Ñ\83 FastAPI. 😎
£ FastAPI Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Pydantic-моделÑ\96 Ð´Ð»Ñ\8f Ð¾Ð³Ð¾Ð»Ð¾Ñ\88еннÑ\8f Ð¿Ð¾Ð»Ñ\96в Ñ\84оÑ\80ми. 😎
index a089ef945ae31e47c36f6aa5df6cb87fc6e31b08..e809bee2257035cef4efaf04da8bc44bf52171c0 100644 (file)
@@ -1,10 +1,10 @@
-# Запити з формами та файлами
+# Запити з формами та файлами { #request-forms-and-files }
 
£ FastAPI Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð´Ð½Ð¾Ñ\87аÑ\81но Ð¾Ñ\82Ñ\80имÑ\83вати файли та поля форми, використовуючи `File` і `Form`.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð´Ð½Ð¾Ñ\87аÑ\81но Ð²Ð¸Ð·Ð½Ð°Ñ\87ати файли та поля форми, використовуючи `File` і `Form`.
 
 /// info | Інформація
 
-Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">python-multipart</a>.
+Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
 
 Переконайтеся, що Ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили бібліотеку, наприклад:
 
@@ -14,21 +14,21 @@ $ pip install python-multipart
 
 ///
 
-## Імпорт `File` та `Form`
+## Імпорт `File` та `Form` { #import-file-and-form }
 
 {* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[3] *}
 
-## Оголошення параметрів `File` та `Form`
+## Оголошення параметрів `File` та `Form` { #define-file-and-form-parameters }
 
 Створіть параметри файлів та форми так само як і для `Body` або `Query`:
 
 {* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[10:12] *}
 
-Файли Ñ\82а Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð·Ð°Ð²Ð°Ð½Ñ\82аженÑ\96 Ñ\8fк Ñ\84оÑ\80мовÑ\96 Ð´Ð°Ð½Ñ\96, Ñ\96 Ð\92и Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е Ñ\8fк Ñ\84айли, Ñ\82ак Ñ\96 Ð²Ð²ÐµÐ´ÐµÐ½Ñ\96 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ем Ð¿Ð¾Ð»Ñ\8f.
+Файли Ñ\82а Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð·Ð°Ð²Ð°Ð½Ñ\82аженÑ\96 Ñ\8fк Ñ\84оÑ\80мовÑ\96 Ð´Ð°Ð½Ñ\96, Ñ\96 Ð\92и Ð¾Ñ\82Ñ\80имаÑ\94Ñ\82е Ñ\84айли Ñ\82а Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми.
 
 Ви також можете оголосити деякі файли як `bytes`, а деякі як `UploadFile`.
 
-/// warning | Ð£Ð²Ð°Ð³Ð°
+/// warning | Ð\9fопеÑ\80едженнÑ\8f
 
 Ви можете оголосити кілька параметрів `File` і `Form` в операції *шляху*, але не можете одночасно оголошувати `Body`-поля, які очікуєте отримати у форматі JSON, оскільки запит матиме тіло, закодоване за допомогою `multipart/form-data`, а не `application/json`.
 
@@ -36,6 +36,6 @@ $ pip install python-multipart
 
 ///
 
-## Підсумок
+## Підсумок { #recap }
 
\92икоÑ\80иÑ\81Ñ\82овÑ\83йÑ\82е `File` Ñ\82а `Form` Ñ\80азом, ÐºÐ¾Ð»Ð¸ Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ð´Ð°Ð½Ñ\96 Ñ\84оÑ\80ми Ñ\82а Ñ\84айли Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ\83 Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96.
+Використовуйте `File` та `Form` разом, коли вам потрібно отримувати дані та файли в одному запиті.
index 10c58a73e435fa8395c11f78b3927e9ea54036b7..2a22ad922a0562b0933f334e6ae5adff123aea79 100644 (file)
@@ -1,12 +1,12 @@
-# Дані форми
+# Дані форми { #form-data }
 
-ЯкÑ\89о Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c JSON, Ð\92и можете використовувати `Form`.
+ЯкÑ\89о Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð¾Ñ\82Ñ\80имÑ\83ваÑ\82и Ð¿Ð¾Ð»Ñ\8f Ñ\84оÑ\80ми Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c JSON, Ð²и можете використовувати `Form`.
 
 /// info | Інформація
 
 Щоб використовувати форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, і потім встановили бібліотеку, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²и створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, і потім встановили бібліотеку, наприклад:
 
 ```console
 $ pip install python-multipart
@@ -14,23 +14,23 @@ $ pip install python-multipart
 
 ///
 
-## Імпорт `Form`
+## Імпорт `Form` { #import-form }
 
 Імпортуйте `Form` з `fastapi`:
 
 {* ../../docs_src/request_forms/tutorial001_an_py39.py hl[3] *}
 
-## Оголошення параметрів `Form`
+## Оголошення параметрів `Form` { #define-form-parameters }
 
-СÑ\82воÑ\80Ñ\8eйÑ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84оÑ\80ми Ñ\82ак Ñ\81амо Ñ\8fк Ð\92и б створювали `Body` або `Query`:
+СÑ\82воÑ\80Ñ\8eйÑ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ñ\84оÑ\80ми Ñ\82ак Ñ\81амо Ñ\8fк Ð²и б створювали `Body` або `Query`:
 
 {* ../../docs_src/request_forms/tutorial001_an_py39.py hl[9] *}
 
 Наприклад, один зі способів використання специфікації OAuth2 (так званий "password flow") вимагає надсилати `username` та `password` як поля форми.
 
-<abbr title="Специфікація">spec</abbr> вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON.
+<abbr title="specification">spec</abbr> вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON.
 
\97 `Form` Ð\92и можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо.
\97 `Form` Ð²и можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо.
 
 /// info | Інформація
 
@@ -44,7 +44,7 @@ $ pip install python-multipart
 
 ///
 
-## Про "поля форми"
+## Про "поля форми" { #about-form-fields }
 
 HTML-форми (`<form></form>`) надсилають дані на сервер у "спеціальному" кодуванні, яке відрізняється від JSON.
 
@@ -56,18 +56,18 @@ HTML-форми (`<form></form>`) надсилають дані на серве
 
 Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі.
 
-ЯкÑ\89о Ð\92и хочете дізнатися більше про ці кодування та поля форм, зверніться до <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> вебдокументації для <code>POST</code></a>.
+ЯкÑ\89о Ð²и хочете дізнатися більше про ці кодування та поля форм, зверніться до <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> вебдокументації для <code>POST</code></a>.
 
 ///
 
 /// warning | Попередження
 
-Ви можете оголосити кілька параметрів `Form`  в *операції шляху*, але не можете одночасно оголосити поля `Body`, які Ви очікуєте отримати у форматі JSON, оскільки тіло запиту буде закодовано у форматі `application/x-www-form-urlencoded`, а не `application/json`.
+Ви можете оголосити кілька параметрів `Form` в *операції шляху*, але не можете одночасно оголосити поля `Body`, які ви очікуєте отримати у форматі JSON, оскільки запит матиме тіло, закодоване як `application/x-www-form-urlencoded`, а не `application/json`.
 
 Це не обмеження **FastAPI**, а частина HTTP-протоколу.
 
 ///
 
-## Підсумок
+## Підсумок { #recap }
 
 Використовуйте `Form` для оголошення вхідних параметрів у вигляді даних форми.
index def1f8a2d56893a6ec427dfe234f7b6d966c61cf..2fcad943879aadf1700d2f5e950c14beda04daf8 100644 (file)
@@ -1,36 +1,35 @@
-# Модель відповіді — Тип, що повертається
+# Модель відповіді — Тип, що повертається { #response-model-return-type }
 
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ñ\82ип, Ñ\8fкий Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82имеÑ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ð²Ñ\96дповÑ\96дÑ\96, Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e *аноÑ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\83, Ñ\89о Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f* *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\94Ñ\8e Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\94Ñ\8e Ñ\88лÑ\8fÑ\85Ñ\83* (path operation)
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ñ\82ип, Ñ\8fкий Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82имеÑ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ð²Ñ\96дповÑ\96дÑ\96, Ð°Ð½Ð¾Ñ\82Ñ\83вавÑ\88и **Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f** *Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83*.
 
-**Ð\90ноÑ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83** Ð¼Ð¾Ð¶Ð½Ð° Ð²ÐºÐ°Ð·Ð°Ñ\82и Ñ\82ак Ñ\81амо Ñ\8fк Ñ\96 Ð´Ð»Ñ\8f Ð²Ñ\85Ñ\96дниÑ\85 **паÑ\80амеÑ\82Ñ\80Ñ\96в** Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97: Ñ\86е Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Pydantic, Ñ\81пиÑ\81ки (lists), Ñ\81ловники (dictionaries), Ñ\81калÑ\8fÑ\80нÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fк-оÑ\82 Ñ\86Ñ\96лÑ\96 Ñ\87иÑ\81ла (integers), Ð±Ñ\83левÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f (booleans) тощо.
+**Ð\90ноÑ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в** Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\82ак Ñ\81амо, Ñ\8fк Ñ\96 Ð´Ð»Ñ\8f Ð²Ñ\85Ñ\96дниÑ\85 Ð´Ð°Ð½Ð¸Ñ\85 Ñ\83 **паÑ\80амеÑ\82Ñ\80аÑ\85** Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97: Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Pydantic, Ñ\81пиÑ\81ки, Ñ\81ловники, Ñ\81калÑ\8fÑ\80нÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f, Ñ\8fк-оÑ\82 Ñ\86Ñ\96лÑ\96 Ñ\87иÑ\81ла, Ð±Ñ\83левÑ\96 Ð·Ð½Ð°Ñ\87еннÑ\8f тощо.
 
 {* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
 
-FastAPI використовуватиме цей тип, щоб:
+FastAPI використовуватиме цей тип повернення, щоб:
 
 * **Перевірити правильність** повернених даних.
-    * Якщо дані не валідні (наприклад, відсутнє поле), це означає, що Ваш код додатку працює некоректно і не повертає те, що повинен. У такому випадку FastAPI поверне помилку сервера, замість того щоб віддати недопустимі дані. Так Ви та Ваші клієнти будете впевнені, що отримуєте очікувані дані у правильному форматі.
-
-* Додати **JSON Schema** відповіді до специфікації OpenAPI в *операціях шляху*.
+    * Якщо дані не валідні (наприклад, відсутнє поле), це означає, що *ваш* код застосунку зламаний, не повертає те, що повинен, і буде повернуто помилку сервера замість некоректних даних. Так ви та ваші клієнти можете бути впевнені, що отримаєте дані й очікувану структуру даних.
+* Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*.
     * Це буде використано в **автоматичній документації**.
-    * Ð\90 Ñ\82акож інструментами, які автоматично генерують клієнтський код.
+    * Ð¦Ðµ Ñ\82акож Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82ано інструментами, які автоматично генерують клієнтський код.
 
 Але найголовніше:
 
-* FastAPI **обмежить та відфільтрує** вихідні дані відповідно до типу, вказаного у відповіді.
-    * Це особливо важливо для **безпеки**. Деталі нижче.
+* Це **обмежить та відфільтрує** вихідні дані до того, що визначено в типі повернення.
+    * Це особливо важливо для **безпеки**, нижче ми побачимо про це більше.
 
-## Параметр `response_model`
+## Параметр `response_model` { #response-model-parameter }
 
\86нодÑ\96 Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð°Ð±Ð¾ Ð·Ñ\80Ñ\83Ñ\87но Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\82и Ñ\96нÑ\88Ñ\96 Ñ\82ипи Ð´Ð°Ð½Ð¸Ñ\85, Ð½Ñ\96ж Ñ\82Ñ\96, Ñ\89о Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\96 Ñ\8fк Ñ\82ип Ð²Ñ\96дповÑ\96дÑ\96.
\84 Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð²Ð°Ð¼ Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð°Ð±Ð¾ Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\82и Ð´Ð°Ð½Ñ\96, Ñ\8fкÑ\96 Ð½Ðµ Ð·Ð¾Ð²Ñ\81Ñ\96м Ð²Ñ\96дповÑ\96даÑ\8eÑ\82Ñ\8c Ñ\82омÑ\83, Ñ\89о Ð¾Ð³Ð¾Ð»Ð¾Ñ\88ено Ñ\82ипом.
 
\9dапÑ\80иклад, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е **повеÑ\80Ñ\82аÑ\82и Ñ\81ловник** Ð°Ð±Ð¾ Ð¾Ð±â\80\99Ñ\94кÑ\82 Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ\85, Ð°Ð»Ðµ **оголоÑ\81иÑ\82и Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic** Ñ\8fк Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð²Ñ\96дповÑ\96дÑ\96. Ð¢Ð¾Ð´Ñ\96 Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¾Ð±Ñ\80облÑ\8fÑ\82име Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e, Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о.
\9dапÑ\80иклад, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ñ\85оÑ\82Ñ\96Ñ\82и **повеÑ\80Ñ\82аÑ\82и Ñ\81ловник** Ð°Ð±Ð¾ Ð¾Ð±â\80\99Ñ\94кÑ\82 Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ\85, Ð°Ð»Ðµ **оголоÑ\81иÑ\82и Ð¹Ð¾Ð³Ð¾ Ñ\8fк Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic**. Ð¢Ð°ÐºÐ¸Ð¼ Ñ\87ином Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82име Ð²Ñ\81Ñ\8e Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85, Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о Ð´Ð»Ñ\8f Ð¾Ð±â\80\99Ñ\94кÑ\82а, Ñ\8fкий Ð²Ð¸ Ð¿Ð¾Ð²ÐµÑ\80нÑ\83ли (напÑ\80иклад, Ñ\81ловника Ð°Ð±Ð¾ Ð¾Ð±â\80\99Ñ\94кÑ\82а Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ\85).
 
-ЯкÑ\89о Ð\92и Ð´Ð¾Ð´Ð°Ñ\81Ñ\82е Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83 Ð´Ð»Ñ\8f Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f, Ñ\80едакÑ\82оÑ\80 ÐºÐ¾Ð´Ñ\83 Ð°Ð±Ð¾ mypy Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð¿Ð¾Ñ\81каÑ\80жиÑ\82иÑ\81Ñ\8f, Ñ\89о Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8f Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94 Ñ\96нÑ\88ий Ñ\82ип (напÑ\80иклад, dict Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Item).
+ЯкÑ\89о Ð²Ð¸ Ð´Ð¾Ð´Ð°Ð»Ð¸ Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83 Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f, Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и Ñ\82а Ñ\80едакÑ\82оÑ\80и Ñ\81каÑ\80жиÑ\82имÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f (коÑ\80екÑ\82ноÑ\8e) Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ\8e, Ð¿Ð¾Ð²Ñ\96домлÑ\8fÑ\8eÑ\87и, Ñ\89о Ð²Ð°Ñ\88а Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\8f Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94 Ñ\82ип (напÑ\80иклад, dict), Ñ\8fкий Ð²Ñ\96дÑ\80Ñ\96знÑ\8fÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð²Ñ\96д Ñ\82ого, Ñ\89о Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\81или (напÑ\80иклад, Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic).
 
-У таких випадках можна скористатися параметром `response_model` в декораторі маршруту (наприклад, @app.get()).
+У таких випадках можна скористатися параметром *декоратора операції шляху* `response_model` замість типу повернення.
 
\9fаÑ\80амеÑ\82Ñ\80 `response_model` Ð¿Ñ\80аÑ\86Ñ\8eÑ\94 Ð· Ð±Ñ\83дÑ\8c\8fким *опеÑ\80аÑ\82оÑ\80ом шляху*:
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `response_model` Ñ\83 Ð±Ñ\83дÑ\8c\8fкÑ\96й Ð· *опеÑ\80аÑ\86Ñ\96й шляху*:
 
 * `@app.get()`
 * `@app.post()`
@@ -42,33 +41,33 @@ FastAPI використовуватиме цей тип, щоб:
 
 /// note | Примітка
 
-Зверніть увагу, що `response_model` є параметром методу-декоратора (`get`, `post`, тощо), а не *функцією операцією шляху* (path operation function), як це робиться з параметрами або тілом запиту.
+Зверніть увагу, що `response_model` є параметром методу «декоратора» (`get`, `post` тощо). А не вашої *функції операції шляху*, як усі параметри та тіло.
 
 ///
 
-`response_model` Ð¿Ñ\80иймаÑ\94 Ñ\82акий Ñ\81амий Ñ\82ип, Ñ\8fкий Ð\92и Ð± Ð²ÐºÐ°Ð·Ð°Ð»Ð¸ Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\8f Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Pydantic. Ð¢Ð¾Ð±Ñ\82о Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ñ\8fк Pydantic-моделÑ\8c, Ñ\82ак Ñ\96, Ð½Ð°Ð¿Ñ\80иклад, `list` Ñ\96з Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Pydantic â\80\94 `List[Item]`.
+`response_model` Ð¿Ñ\80иймаÑ\94 Ñ\82акий Ñ\81амий Ñ\82ип, Ñ\8fкий Ð²Ð¸ Ð± Ð²ÐºÐ°Ð·Ð°Ð»Ð¸ Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\8f Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Pydantic, Ñ\82обÑ\82о Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic, Ð°Ð»Ðµ Ñ\82акож Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и, Ð½Ð°Ð¿Ñ\80иклад, `list` Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Pydantic, Ñ\8fк-оÑ\82 `List[Item]`.
 
-FastAPI використовуватиме `response_model` для створення документації, валідації даних та — найважливіше — **перетворення та фільтрації вихідних даних** згідно з оголошеним типом.
+FastAPI використовуватиме цей `response_model` для виконання всієї документації даних, валідації тощо, а також для **перетворення та фільтрації вихідних даних** до оголошеного типу.
 
 /// tip | Порада
 
-ЯкÑ\89о Ñ\83 Ð\92аÑ\81 Ñ\83вÑ\96мкнено Ñ\81Ñ\83воÑ\80Ñ\83 Ð¿ÐµÑ\80евÑ\96Ñ\80кÑ\83 Ñ\82ипÑ\96в Ñ\83 Ñ\80едакÑ\82оÑ\80Ñ\96, mypy Ñ\82оÑ\89о, Ð\92и можете оголосити тип повернення функції як `Any`.
+ЯкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\83вÑ\96мкнено Ñ\81Ñ\83воÑ\80Ñ\83 Ð¿ÐµÑ\80евÑ\96Ñ\80кÑ\83 Ñ\82ипÑ\96в Ñ\83 Ñ\80едакÑ\82оÑ\80Ñ\96, mypy Ñ\82оÑ\89о, Ð²и можете оголосити тип повернення функції як `Any`.
 
-Таким Ñ\87ином, Ð\92и Ð¿Ð¾Ð²Ñ\96домлÑ\8fÑ\94Ñ\82е Ñ\80едакÑ\82оÑ\80Ñ\83, Ñ\89о Ñ\81вÑ\96домо Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ð±Ñ\83дÑ\8c\89о. Ð\90ле FastAPI Ñ\83Ñ\81е Ð¾Ð´Ð½Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82име Ñ\81Ñ\82воÑ\80еннÑ\8f Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97, Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e, Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Ð¿Ð°Ñ\80амеÑ\82Ñ\80а `response_model`.
+Таким Ñ\87ином, Ð²Ð¸ Ð¿Ð¾Ð²Ñ\96домлÑ\8fÑ\94Ñ\82е Ñ\80едакÑ\82оÑ\80Ñ\83, Ñ\89о Ñ\81вÑ\96домо Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ð±Ñ\83дÑ\8c\89о. Ð\90ле FastAPI Ñ\83Ñ\81е Ð¾Ð´Ð½Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82име Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85, Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e, Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e `response_model`.
 
 ///
 
-### Пріоритет `response_model`
+### Пріоритет `response_model` { #response-model-priority }
 
-ЯкÑ\89о Ð\92и Ð²ÐºÐ°Ð·Ñ\83Ñ\94Ñ\82е Ñ\96 Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f, Ñ\96 `response_model`, Ñ\82о FastAPI Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82име `response_model` Ð· Ð¿Ñ\80Ñ\96оÑ\80иÑ\82еÑ\82ом.
+ЯкÑ\89о Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е Ñ\96 Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f, Ñ\96 `response_model`, Ñ\82о `response_model` Ð¼Ð°Ñ\82име Ð¿Ñ\80Ñ\96оÑ\80иÑ\82еÑ\82 Ñ\96 Ð±Ñ\83де Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аний FastAPI.
 
-Таким чином, Ви можете додати правильні анотації типів до ваших функцій, навіть якщо вони повертають тип, відмінний від `response_model`. Це буде корисно для редакторів коду та інструментів, таких як mypy. І при цьому FastAPI продовжить виконувати валідацію даних, генерувати документацію тощо на основі `response_model`.
+Таким чином ви можете додати правильні анотації типів до ваших функцій, навіть коли повертаєте тип, відмінний від моделі відповіді, щоб це використовували редактор і інструменти на кшталт mypy. І при цьому FastAPI все одно виконуватиме валідацію даних, документацію тощо, використовуючи `response_model`.
 
-Ви також можете використати `response_model=None`, щоб вимкнути створення моделі відповіді для цієї *операції шляху*. Це може знадобитися, якщо Ви додаєте анотації типів до об'єктів, які не є допустимими полями Pydantic — приклад цього Ви побачите в одному з наступних розділів.
+Ви також можете використати `response_model=None`, щоб вимкнути створення моделі відповіді для цієї *операції шляху*; це може знадобитися, якщо ви додаєте анотації типів для речей, які не є валідними полями Pydantic, приклад цього ви побачите в одному з розділів нижче.
 
-## Повернути ті самі вхідні дані
+## Повернути ті самі вхідні дані { #return-the-same-input-data }
 
-Тут ми оголошуємо модель `UserIn`, яка містить звичайний текстовий пароль:
+Тут ми оголошуємо модель `UserIn`, вона міститиме пароль у відкритому вигляді:
 
 {* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
 
@@ -76,7 +75,7 @@ FastAPI використовуватиме `response_model` для створе
 
 Щоб використовувати `EmailStr`, спочатку встановіть <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a>.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8c, Ñ\89о Ð\92и створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²и створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад:
 
 ```console
 $ pip install email-validator
@@ -90,29 +89,29 @@ $ pip install "pydantic[email]"
 
 ///
 
-І ми використовуємо цю модель, щоб оголосити і вхідні, і вихідні дані:
+І ми використовуємо цю модель, щоб оголосити наші вхідні дані, і цю ж модель, щоб оголосити наші вихідні дані:
 
 {* ../../docs_src/response_model/tutorial002_py310.py hl[16] *}
 
-Тепер, коли браузер створює користувача з паролем, API поверне той самий пароль у відповіді.
+Тепер, щоразу коли браузер створює користувача з паролем, API поверне той самий пароль у відповіді.
 
-У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð½Ðµ Ð±Ñ\83Ñ\82и Ð¿Ñ\80облемоÑ\8e, Ð°Ð´Ð¶Ðµ Ñ\81аме ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87 Ð½Ð°Ð´Ñ\96Ñ\81лав пароль.
+У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð½Ðµ Ð±Ñ\83Ñ\82и Ð¿Ñ\80облемоÑ\8e, Ð°Ð´Ð¶Ðµ Ñ\86е Ñ\82ой Ñ\81амий ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87 Ð½Ð°Ð´Ñ\81илаÑ\94 пароль.
 
-Але якщо ми використаємо цю ж модель для іншої операції шляху, ми можемо випадково надіслати паролі наших користувачів кожному клієнту.
+Але якщо ми використаємо цю ж модель для іншої *операції шляху*, ми можемо надсилати паролі наших користувачів кожному клієнту.
 
 /// danger | Обережно
 
-Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді, якщо тільки Ви не знаєте всі ризики і точно розумієте, що робите.
+Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всіх застережень і точно розумієте, що робите.
 
 ///
 
-## Додайте окрему вихідну модель
+## Додати вихідну модель { #add-an-output-model }
 
\97амÑ\96Ñ\81Ñ\82Ñ\8c Ñ\86Ñ\8cого Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ñ\81Ñ\82воÑ\80иÑ\82и Ð²Ñ\85Ñ\96днÑ\83 Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð· Ð²Ñ\96дкÑ\80иÑ\82им Ð¿Ð°Ñ\80олем і вихідну модель без нього:
\97амÑ\96Ñ\81Ñ\82Ñ\8c Ñ\86Ñ\8cого Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ñ\81Ñ\82воÑ\80иÑ\82и Ð²Ñ\85Ñ\96днÑ\83 Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð· Ð¿Ð°Ñ\80олем Ñ\83 Ð²Ñ\96дкÑ\80иÑ\82омÑ\83 Ð²Ð¸Ð³Ð»Ñ\8fдÑ\96 і вихідну модель без нього:
 
 {* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *}
 
-Тут, навіть якщо *функція операції шляху* повертає об'єкт користувача, який містить пароль:
+Тут, хоча наша *функція операції шляху* повертає того самого вхідного користувача, який містить пароль:
 
 {* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
 
@@ -120,107 +119,107 @@ $ pip install "pydantic[email]"
 
 {* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
 
-Таким Ñ\87ином, **FastAPI** Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð²Ñ\96дÑ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\83Ñ\94 Ð²Ñ\81Ñ\96 Ð´Ð°Ð½Ñ\96, Ñ\8fкÑ\96 Ð½Ðµ Ð²ÐºÐ°Ð·Ð°Ð½Ñ\96 Ñ\83 Ð²Ð¸Ñ\85Ñ\96днÑ\96й Ð¼Ð¾Ð´ÐµÐ»Ñ\96 (за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Pydantic).
+Таким Ñ\87ином, **FastAPI** Ð¿Ð¾Ð´Ð±Ð°Ñ\94 Ð¿Ñ\80о Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ð²Ñ\81Ñ\96Ñ\85 Ð´Ð°Ð½Ð¸Ñ\85, Ñ\8fкÑ\96 Ð½Ðµ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88енÑ\96 Ñ\83 Ð²Ð¸Ñ\85Ñ\96днÑ\96й Ð¼Ð¾Ð´ÐµÐ»Ñ\96 (викоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Pydantic).
 
-### `response_model` або тип повернення
+### `response_model` або тип повернення { #response-model-or-return-type }
 
-У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83, Ð¾Ñ\81кÑ\96лÑ\8cки Ð´Ð²Ñ\96 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ñ\80Ñ\96знÑ\96, Ñ\8fкÑ\89о Ð¼Ð¸ Ð°Ð½Ð¾Ñ\82Ñ\83Ñ\94мо Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\8fк `UserOut`, Ñ\80едакÑ\82оÑ\80 Ñ\96 Ñ\82акÑ\96 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и, Ñ\8fк mypy, Ð²Ð¸Ð´Ð°Ð´Ñ\83Ñ\82Ñ\8c Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83, Ð±Ð¾ Ñ\84акÑ\82иÑ\87но Ð¼Ð¸ Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94мо Ñ\96нÑ\88ий Ñ\82ип.
+У Ñ\86Ñ\8cомÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83, Ð¾Ñ\81кÑ\96лÑ\8cки Ð´Ð²Ñ\96 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ñ\80Ñ\96знÑ\96, Ñ\8fкÑ\89о Ð¼Ð¸ Ð°Ð½Ð¾Ñ\82Ñ\83Ñ\94мо Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\8fк `UserOut`, Ñ\80едакÑ\82оÑ\80 Ñ\96 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и Ñ\81каÑ\80жиÑ\82имÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f, Ñ\89о Ð¼Ð¸ Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94мо Ð½ÐµÐ²Ð°Ð»Ñ\96дний Ñ\82ип, Ð°Ð´Ð¶Ðµ Ñ\86е Ñ\80Ñ\96знÑ\96 ÐºÐ»Ð°Ñ\81и.
 
¢Ð¾Ð¼Ñ\83 Ð² Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 Ð¼Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94мо Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `response_model`, Ð° Ð½Ðµ Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83 Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f.
¡Ð°Ð¼Ðµ Ñ\82омÑ\83 Ð² Ñ\86Ñ\8cомÑ\83 Ð¿Ñ\80икладÑ\96 Ð½Ð°Ð¼ Ñ\82Ñ\80еба Ð¾Ð³Ð¾Ð»Ð¾Ñ\81иÑ\82и Ñ\86е Ñ\87еÑ\80ез Ð¿Ð°Ñ\80амеÑ\82Ñ\80 `response_model`.
 
-...але читайте далі, щоб дізнатися, як обійти це обмеження.
+...але читайте далі нижче, щоб побачити, як це обійти.
 
-## Тип повернення і фільтрація даних
+## Тип повернення і фільтрація даних { #return-type-and-data-filtering }
 
-Продовжимо з попереднього прикладу. Ми хотіли **анотувати функцію одним типом**, але при цьому повертати з неї більше даних.
+Продовжимо з попереднього прикладу. Ми хотіли **анотувати функцію одним типом**, але хотіли мати змогу повертати з функції те, що насправді містить **більше даних**.
 
-Ми хочемо, щоб FastAPI продовжував **фільтрувати** ці дані за допомогою response_model. Тобто навіть якщо функція повертає більше інформації, у відповіді будуть лише ті поля, які вказані у response_model.
+Ми хочемо, щоб FastAPI продовжував **фільтрувати** дані, використовуючи модель відповіді. Тобто навіть якщо функція повертає більше даних, відповідь міститиме лише поля, оголошені в моделі відповіді.
 
-У попередньому прикладі, оскільки класи були різні, нам довелося використовувати параметр `response_model`. Але це означає, що ми не отримуємо підтримки з боку редактора коду та інструментів перевірки типів щодо типу, який повертає функція.
+У попередньому прикладі, оскільки класи були різні, нам довелося використовувати параметр `response_model`. Але це також означає, що ми не отримуємо підтримки від редактора та інструментів, які перевіряють тип повернення функції.
 
-Проте в більшості випадків, коли нам потрібно зробити щось подібне, ми просто хочемо, щоб модель **відфільтрувала або прибрала** частину даних, як у цьому прикладі.
+Проте в більшості випадків, коли нам потрібно зробити щось подібне, ми просто хочемо, щоб модель **відфільтрувала/прибрала** частину даних, як у цьому прикладі.
 
£ Ñ\82акиÑ\85 Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ\85 Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и ÐºÐ»Ð°Ñ\81и Ñ\82а Ñ\81падкÑ\83ваннÑ\8f, Ñ\89об Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f **аноÑ\82аÑ\86Ñ\96Ñ\8fми Ñ\82ипÑ\96в** Ñ\84Ñ\83нкÑ\86Ñ\96й â\80\94 Ñ\86е Ð´Ð°Ñ\94 ÐºÑ\80аÑ\89Ñ\83 Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ð· Ð±Ð¾ÐºÑ\83 Ñ\80едакÑ\82оÑ\80а Ñ\82а Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в Ñ\82ипÑ\83 mypy, Ñ\96 Ð¿Ñ\80и Ñ\86Ñ\8cомÑ\83 FastAPI Ð¿Ñ\80одовжÑ\83Ñ\94 Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и **Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85** Ñ\83 Ð²Ñ\96дповÑ\96дÑ\96.
\86 Ð² Ñ\82акиÑ\85 Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ\85 Ð¼Ð¸ Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и ÐºÐ»Ð°Ñ\81и Ñ\82а Ñ\81падкÑ\83ваннÑ\8f, Ñ\89об Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f **аноÑ\82аÑ\86Ñ\96Ñ\8fми Ñ\82ипÑ\96в** Ñ\84Ñ\83нкÑ\86Ñ\96й Ñ\96 Ð¾Ñ\82Ñ\80имаÑ\82и ÐºÑ\80аÑ\89Ñ\83 Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ð² Ñ\80едакÑ\82оÑ\80Ñ\96 Ñ\82а Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82аÑ\85, Ñ\96 Ð¿Ñ\80и Ñ\86Ñ\8cомÑ\83 Ð·Ð±ÐµÑ\80егÑ\82и **Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85** Ñ\83 FastAPI.
 
 {* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}
 
\97авдÑ\8fки Ñ\86Ñ\8cомÑ\83 Ð¼Ð¸ Ð¾Ñ\82Ñ\80имÑ\83Ñ\94мо Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в â\80\94 Ð²Ñ\96д Ñ\80едакÑ\82оÑ\80Ñ\96в Ñ\96 mypy, Ð¾Ñ\81кÑ\96лÑ\8cки Ñ\86ей ÐºÐ¾Ð´ Ñ\94 ÐºÐ¾Ñ\80екÑ\82ним з точки зору типів, — але ми також отримуємо фільтрацію даних від FastAPI.
\97авдÑ\8fки Ñ\86Ñ\8cомÑ\83 Ð¼Ð¸ Ð¾Ñ\82Ñ\80имÑ\83Ñ\94мо Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в â\80\94 Ð²Ñ\96д Ñ\80едакÑ\82оÑ\80Ñ\96в Ñ\96 mypy, Ð°Ð´Ð¶Ðµ Ñ\86ей ÐºÐ¾Ð´ ÐºÐ¾Ñ\80екÑ\82ний з точки зору типів, — але ми також отримуємо фільтрацію даних від FastAPI.
 
 Як це працює? Давайте розберемося. 🤓
 
-### Ð¢Ð¸Ð¿Ð¸ Ñ\82а Ð¿Ñ\96дÑ\82Ñ\80имка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в
+### Ð\90ноÑ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в Ñ\96 Ð¿Ñ\96дÑ\82Ñ\80имка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в { #type-annotations-and-tooling }
 
-Спершу подивимось, як це бачать редактори, mypy та інші інструменти.
+Спершу подивімося, як це бачать редактори, mypy та інші інструменти.
 
-`BaseUser` має базові поля. Потім `UserIn` успадковує `BaseUser` і додає поле `password`, отже, він матиме всі поля з обох моделей.
+`BaseUser` має базові поля. Потім `UserIn` успадковує `BaseUser` і додає поле `password`, отже він включатиме всі поля з обох моделей.
 
\9cи Ð·Ð°Ð·Ð½Ð°Ñ\87аємо тип повернення функції як `BaseUser`, але фактично повертаємо екземпляр `UserIn`.
\9cи Ð°Ð½Ð¾Ñ\82Ñ\83ємо тип повернення функції як `BaseUser`, але фактично повертаємо екземпляр `UserIn`.
 
-Редактор, mypy та інші інструменти не скаржитимуться на це, тому що з точки зору типізації `UserIn` є підкласом `BaseUser`, а це означає, що він є `валідним` типом, коли очікується будь-що, що є `BaseUser`.
+Редактор, mypy та інші інструменти не скаржитимуться на це, тому що з точки зору типізації `UserIn` є підкласом `BaseUser`, а це означає, що він є *валідним* типом, коли очікується будь-що, що є `BaseUser`.
 
-### Фільтрація даних у FastAPI
+### Фільтрація даних у FastAPI { #fastapi-data-filtering }
 
-ТепеÑ\80 Ð´Ð»Ñ\8f FastAPI Ð²Ñ\96н Ð±Ð°Ñ\87иÑ\82Ñ\8c Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\96 Ð¿ÐµÑ\80еконÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f, Ñ\89о Ñ\82е, Ñ\89о Ð\92и Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е, Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c **Ñ\82Ñ\96лÑ\8cки** поля, які оголошені у цьому типі.
+ТепеÑ\80 Ð´Ð»Ñ\8f FastAPI Ð²Ñ\96н Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82Ñ\8c Ñ\82ип Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\96 Ð¿ÐµÑ\80еконаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f, Ñ\89о Ñ\82е, Ñ\89о Ð²Ð¸ Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е, Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c **лиÑ\88е** поля, які оголошені у цьому типі.
 
-FastAPI виконує кілька внутрішніх операцій з Pydantic, щоб гарантувати, що правила наслідування класів не застосовуються для фільтрації повернених даних, інакше Ви могли б повернути значно більше даних, ніж очікували.
+FastAPI виконує кілька внутрішніх операцій з Pydantic, щоб гарантувати, що ті самі правила наслідування класів не застосовуються для фільтрації повернених даних, інакше ви могли б зрештою повертати значно більше даних, ніж очікували.
 
-Таким чином, Ви отримуєте найкраще з двох світів: анотації типів **з підтримкою інструментів** і **фільтрацію даних**.
+Таким чином ви можете отримати найкраще з двох світів: анотації типів із **підтримкою інструментів** і **фільтрацію даних**.
 
-## Ð\9fодивиÑ\82иÑ\81Ñ\8c Ñ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97
+## Ð\9fодивиÑ\82иÑ\81Ñ\8f Ð² Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 { #see-it-in-the-docs }
 
\9aоли Ð\92и Ð´Ð¸Ð²Ð¸Ñ\82еÑ\81Ñ\8c Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и, Ñ\89о Ð²Ñ\85Ñ\96дна Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ñ\96 Ð²Ð¸Ñ\85Ñ\96дна Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð²Ð»Ð°Ñ\81нÑ\83 JSON-Ñ\81Ñ\85емÑ\83:
\9aоли Ð²Ð¸ Ð´Ð¸Ð²Ð¸Ñ\82еÑ\81Ñ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80евÑ\96Ñ\80иÑ\82и, Ñ\89о Ð²Ñ\85Ñ\96дна Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ñ\96 Ð²Ð¸Ñ\85Ñ\96дна Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð¼Ð°Ñ\82имÑ\83Ñ\82Ñ\8c Ð²Ð»Ð°Ñ\81нÑ\83 JSON Schema:
 
 <img src="/img/tutorial/response-model/image01.png">
 
\86 Ð¾Ð±Ð¸Ð´Ð²Ñ\96 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f Ñ\96нÑ\82еÑ\80акÑ\82ивноÑ\97 API-докÑ\83менÑ\82аÑ\86Ñ\96Ñ\97:
\86 Ð¾Ð±Ð¸Ð´Ð²Ñ\96 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82анÑ\96 Ð´Ð»Ñ\8f Ñ\96нÑ\82еÑ\80акÑ\82ивноÑ\97 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 API:
 
 <img src="/img/tutorial/response-model/image02.png">
 
-## Інші анотації типів повернення
+## Інші анотації типів повернення { #other-return-type-annotations }
 
\86Ñ\81нÑ\83Ñ\8eÑ\82Ñ\8c Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð\92и Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ñ\89оÑ\81Ñ\8c, Ñ\89о Ð½Ðµ Ñ\94 Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имим Ð¿Ð¾Ð»ÐµÐ¼ Pydantic, Ð°Ð»Ðµ анотуєте це у функції лише для того, щоб отримати підтримку від інструментів (редактора, mypy тощо).
\9cожÑ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, ÐºÐ¾Ð»Ð¸ Ð²Ð¸ Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ñ\89оÑ\81Ñ\8c, Ñ\89о Ð½Ðµ Ñ\94 Ð²Ð°Ð»Ñ\96дним Ð¿Ð¾Ð»ÐµÐ¼ Pydantic, Ñ\96 анотуєте це у функції лише для того, щоб отримати підтримку від інструментів (редактора, mypy тощо).
 
-### Повернення Response напряму
+### Повернути Response напряму { #return-a-response-directly }
 
 Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}.
 
-{* ../../docs_src/response_model/tutorial003_02.py hl[8,10:11] *}
+{* ../../docs_src/response_model/tutorial003_02_py39.py hl[8,10:11] *}
 
 Цей простий випадок автоматично обробляється FastAPI, тому що анотація типу повернення — це клас (або підклас) `Response`.
 
 І інструменти також будуть задоволені, бо і `RedirectResponse`, і `JSONResponse` є підкласами `Response`, отже анотація типу коректна.
 
-### Анотація підкласу Response
+### Анотувати підклас Response { #annotate-a-response-subclass }
 
¢Ð°ÐºÐ¾Ð¶ Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¿Ñ\96дклаÑ\81 `Response` Ñ\83 анотації типу:
\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ð¿Ñ\96дклаÑ\81 `Response` Ð² анотації типу:
 
-{* ../../docs_src/response_model/tutorial003_03.py hl[8:9] *}
+{* ../../docs_src/response_model/tutorial003_03_py39.py hl[8:9] *}
 
 Це теж працюватиме, бо `RedirectResponse` — підклас `Response`, і FastAPI автоматично обробить цей простий випадок.
 
-### Некоректні анотації типу повернення
+### Некоректні анотації типу повернення { #invalid-return-type-annotations }
 
\90ле ÐºÐ¾Ð»Ð¸ Ð\92и Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ñ\8fкийÑ\81Ñ\8c Ñ\96нÑ\88ий Ð´Ð¾Ð²Ñ\96лÑ\8cний Ð¾Ð±â\80\99Ñ\94кÑ\82, Ñ\89о Ð½Ðµ Ñ\94 Ð²Ð°Ð»Ñ\96дним Ñ\82ипом Pydantic (напÑ\80иклад, Ð¾Ð±â\80\99Ñ\94кÑ\82 Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ\85), Ñ\96 Ð°Ð½Ð¾Ñ\82Ñ\83Ñ\94Ñ\82е Ð¹Ð¾Ð³Ð¾ Ñ\82ак Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, FastAPI Ñ\81пÑ\80обÑ\83Ñ\94 Ñ\81Ñ\82воÑ\80иÑ\82и Pydantic Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð²Ñ\96дповÑ\96дÑ\96 Ð½Ð° Ð¾Ñ\81новÑ\96 Ñ\86Ñ\96Ñ\94Ñ\97 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\83, і це завершиться помилкою.
\90ле ÐºÐ¾Ð»Ð¸ Ð²Ð¸ Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\94Ñ\82е Ñ\8fкийÑ\81Ñ\8c Ñ\96нÑ\88ий Ð´Ð¾Ð²Ñ\96лÑ\8cний Ð¾Ð±â\80\99Ñ\94кÑ\82, Ñ\89о Ð½Ðµ Ñ\94 Ð²Ð°Ð»Ñ\96дним Ñ\82ипом Pydantic (напÑ\80иклад, Ð¾Ð±â\80\99Ñ\94кÑ\82 Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ\85), Ñ\96 Ð°Ð½Ð¾Ñ\82Ñ\83Ñ\94Ñ\82е Ð¹Ð¾Ð³Ð¾ Ñ\82ак Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, FastAPI Ñ\81пÑ\80обÑ\83Ñ\94 Ñ\81Ñ\82воÑ\80иÑ\82и Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Ð²Ñ\96дповÑ\96дÑ\96 Pydantic Ð½Ð° Ð¾Ñ\81новÑ\96 Ñ\86Ñ\96Ñ\94Ñ\97 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\83 і це завершиться помилкою.
 
-Те Ñ\81аме Ñ\81Ñ\82анеÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\8fкÑ\89о Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е <abbr title="Ð\9eб'Ñ\94днаннÑ\8f (union) ÐºÑ\96лÑ\8cкоÑ\85 Ñ\82ипÑ\96в Ð¾Ð·Ð½Ð°Ñ\87аÑ\94: Â«Ð±Ñ\83дÑ\8c\8fкий Ð· Ñ\86иÑ\85 Ñ\82ипÑ\96в».">union</abbr> Ð¼Ñ\96ж Ñ\80Ñ\96зними Ñ\82ипами, Ð´Ðµ Ð¾Ð´Ð¸Ð½ Ð°Ð±Ð¾ Ð±Ñ\96лÑ\8cÑ\88е Ð½Ðµ Ñ\94 Ð²Ð°Ð»Ñ\96дними Ñ\82ипами Pydantic, Ð½Ð°Ð¿Ñ\80иклад, Ñ\86е Ñ\81пÑ\80иÑ\87иниÑ\82Ñ\8c Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ\83 💥:
+Те Ñ\81аме Ñ\81Ñ\82анеÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\8fкÑ\89о Ð²Ð¸ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\94Ñ\82е <abbr title='Ð\9eбâ\80\99Ñ\94днаннÑ\8f (union) Ð¼Ñ\96ж ÐºÑ\96лÑ\8cкома Ñ\82ипами Ð¾Ð·Ð½Ð°Ñ\87аÑ\94 Â«Ð±Ñ\83дÑ\8c\8fкий Ñ\96з Ñ\86иÑ\85 Ñ\82ипÑ\96в».'>union</abbr> Ð¼Ñ\96ж Ñ\80Ñ\96зними Ñ\82ипами, Ð´Ðµ Ð¾Ð´Ð¸Ð½ Ð°Ð±Ð¾ Ð±Ñ\96лÑ\8cÑ\88е Ð½Ðµ Ñ\94 Ð²Ð°Ð»Ñ\96дними Ñ\82ипами Pydantic, Ð½Ð°Ð¿Ñ\80иклад, Ñ\86е Ð·Ð°Ð²ÐµÑ\80Ñ\88иÑ\82Ñ\8cÑ\81Ñ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ\8e 💥:
 
 {* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
 
-...це не працює, тому що тип анотації не є типом Pydantic і не є просто класом `Response` або його підкласом, а є об’єднанням (union) — або `Response`, або `dict`.
+...це не працює, тому що анотація типу не є типом Pydantic і не є просто одним класом `Response` або його підкласом, це union (будь-який із двох) між `Response` і `dict`.
 
-### Відключення Моделі Відповіді
+### Вимкнути модель відповіді { #disable-response-model }
 
\9fÑ\80одовжÑ\83Ñ\8eÑ\87и Ð¿Ñ\80иклад Ð²Ð¸Ñ\89е, Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, Ð\92и Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85, Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о, Ñ\8fкÑ\96 FastAPI Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\94 Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм.
\9fÑ\80одовжÑ\83Ñ\8eÑ\87и Ð¿Ñ\80иклад Ð²Ð¸Ñ\89е, Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, Ð²Ð¸ Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð¼Ð°Ñ\82и Ñ\81Ñ\82андаÑ\80Ñ\82нÑ\83 Ð²Ð°Ð»Ñ\96даÑ\86Ñ\96Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85, Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ñ\82оÑ\89о, Ñ\8fкÑ\96 Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\94 FastAPI.
 
\90ле Ð²Ð¸ Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ\82е Ð·Ð°Ð»Ð¸Ñ\88иÑ\82и Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83 Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\89об Ð·Ð±ÐµÑ\80егÑ\82и Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ð· Ð±Ð¾ÐºÑ\83 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в, Ñ\82акиÑ\85 Ñ\8fк Ñ\80едакÑ\82оÑ\80и ÐºÐ¾Ð´Ñ\83 Ð°Ð±Ð¾ Ñ\81Ñ\82аÑ\82иÑ\87нÑ\96 перевірки типів (наприклад, mypy).
\90ле Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\81е Ð¾Ð´Ð½Ð¾ Ñ\85оÑ\82Ñ\96Ñ\82и Ð·Ð°Ð»Ð¸Ñ\88иÑ\82и Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\8e Ñ\82ипÑ\83 Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ñ\83 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ñ\89об Ð¾Ñ\82Ñ\80имаÑ\82и Ð¿Ñ\96дÑ\82Ñ\80имкÑ\83 Ð²Ñ\96д Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в, Ñ\8fк-оÑ\82 Ñ\80едакÑ\82оÑ\80и Ñ\82а перевірки типів (наприклад, mypy).
 
 У такому випадку ви можете вимкнути генерацію моделі відповіді, встановивши `response_model=None`:
 
 {* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *}
 
-Це Ð·Ð¼Ñ\83Ñ\81иÑ\82Ñ\8c FastAPI Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82и Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\8e Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð²Ñ\96дповÑ\96дÑ\96, Ñ\96 Ñ\82аким Ñ\87ином Ð\92и Ð·Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð±Ñ\83дÑ\8c\8fкÑ\96 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ð±ÐµÐ· Ð²Ð¿Ð»Ð¸Ð²Ñ\83 Ð½Ð° Ð²Ð°Ñ\88Ñ\83 FastAPI Ð°Ð¿Ð»Ñ\96каÑ\86Ñ\96Ñ\8e. 🤓
+Це Ð·Ð¼Ñ\83Ñ\81иÑ\82Ñ\8c FastAPI Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82и Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\8e Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð²Ñ\96дповÑ\96дÑ\96, Ñ\96 Ñ\82аким Ñ\87ином Ð²Ð¸ Ð·Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð±Ñ\83дÑ\8c\8fкÑ\96 Ð¿Ð¾Ñ\82Ñ\80Ñ\96бнÑ\96 Ð°Ð½Ð¾Ñ\82аÑ\86Ñ\96Ñ\97 Ñ\82ипÑ\96в Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f Ð±ÐµÐ· Ð²Ð¿Ð»Ð¸Ð²Ñ\83 Ð½Ð° Ð²Ð°Ñ\88 FastAPI Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нок. 🤓
 
-## Параметри кодування моделі відповіді
+## Параметри кодування моделі відповіді { #response-model-encoding-parameters }
 
 Ваша модель відповіді може мати значення за замовчуванням, наприклад:
 
@@ -230,19 +229,19 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
 * `tax: float = 10.5` має значення за замовчуванням `10.5`.
 * `tags: List[str] = []` має значення за замовчуванням порожній список: `[]`.
 
\90ле Ð\92и можете захотіти не включати їх у результат, якщо вони фактично не були збережені.
°Ð»Ðµ Ð²и можете захотіти не включати їх у результат, якщо вони фактично не були збережені.
 
\9dапÑ\80иклад, Ñ\8fкÑ\89о Ñ\83 Ð\92аÑ\81 Ñ\94 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð· Ð±Ð°Ð³Ð°Ñ\82Ñ\8cма Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковими Ð°Ñ\82Ñ\80ибÑ\83Ñ\82ами Ñ\83 NoSQL Ð±Ð°Ð·Ñ\96 Ð´Ð°Ð½Ð¸Ñ\85, Ð°Ð»Ðµ Ð\92и Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð²Ñ\96дпÑ\80авлÑ\8fти дуже довгі JSON-відповіді, повні значень за замовчуванням.
\9dапÑ\80иклад, Ñ\8fкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð· Ð±Ð°Ð³Ð°Ñ\82Ñ\8cма Ð½ÐµÐ¾Ð±Ð¾Ð²â\80\99Ñ\8fзковими Ð°Ñ\82Ñ\80ибÑ\83Ñ\82ами Ñ\83 NoSQL Ð±Ð°Ð·Ñ\96 Ð´Ð°Ð½Ð¸Ñ\85, Ð°Ð»Ðµ Ð²Ð¸ Ð½Ðµ Ñ\85оÑ\87еÑ\82е Ð½Ð°Ð´Ñ\81илати дуже довгі JSON-відповіді, повні значень за замовчуванням.
 
-### Використовуйте параметр `response_model_exclude_unset`
+### Використовуйте параметр `response_model_exclude_unset` { #use-the-response-model-exclude-unset-parameter }
 
-Ви можете встановити параметр декоратора шляху `response_model_exclude_unset=True`:
+Ви можете встановити параметр *декоратора операції шляху* `response_model_exclude_unset=True`:
 
 {* ../../docs_src/response_model/tutorial004_py310.py hl[22] *}
 
-і ці значення за замовчуванням не будуть включені у відповідь, тільки фактично встановлені значення.
+і ці значення за замовчуванням не будуть включені у відповідь, лише значення, які фактично встановлені.
 
\9eÑ\82же, Ñ\8fкÑ\89о Ð\92и Ð½Ð°Ð´Ñ\96Ñ\88леÑ\82е Ð·Ð°Ð¿Ð¸Ñ\82 Ð´Ð¾ Ñ\86Ñ\8cого Ð¾Ð¿ÐµÑ\80аÑ\82оÑ\80а Ñ\88лÑ\8fÑ\85Ñ\83 Ð´Ð»Ñ\8f ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82а Ð· item_id `foo`, відповідь (без включення значень за замовчуванням) буде:
\9eÑ\82же, Ñ\8fкÑ\89о Ð²Ð¸ Ð½Ð°Ð´Ñ\96Ñ\88леÑ\82е Ð·Ð°Ð¿Ð¸Ñ\82 Ð´Ð¾ Ñ\86Ñ\96Ñ\94Ñ\97 *опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83* Ð´Ð»Ñ\8f ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82а Ð· ID `foo`, відповідь (без включення значень за замовчуванням) буде:
 
 ```JSON
 {
@@ -253,32 +252,18 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
 
 /// info | Інформація
 
-У Pydantic версії 1 метод називався `.dict()`, він був застарілий (але ще підтримується) у Pydantic версії 2 і перейменований у `.model_dump()`.
-
-Приклади тут використовують `.dict()` для сумісності з Pydantic v1, але Вам слід використовувати `.model_dump()`, якщо Ви можете використовувати Pydantic v2.
-
-///
-
-/// info | Інформація
-
-FastAPI використовує `.dict()` моделі Pydantic з <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">параметром `exclude_unset`</a>, щоб досягти цього.
-
-///
-
-/// info | Інформація
-
 Ви також можете використовувати:
 
 * `response_model_exclude_defaults=True`
 * `response_model_exclude_none=True`
 
-як описано в <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">документації Pydantic</a> for `exclude_defaults` та `exclude_none`.
+як описано в <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">документації Pydantic</a> для `exclude_defaults` та `exclude_none`.
 
 ///
 
-#### Дані зі значеннями для полів із типовими значеннями
+#### Дані зі значеннями для полів із типовими значеннями { #data-with-values-for-fields-with-defaults }
 
\90ле Ñ\8fкÑ\89о Ð\92аÑ\88Ñ\96 Ð´Ð°Ð½Ñ\96 Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð·Ð½Ð°Ñ\87еннÑ\8f Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\96в Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð· Ñ\82иповими Ð·Ð½Ð°Ñ\87еннÑ\8fми, Ñ\8fк Ñ\83 ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82а Ð· item_id `bar`:
\90ле Ñ\8fкÑ\89о Ð²Ð°Ñ\88Ñ\96 Ð´Ð°Ð½Ñ\96 Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð·Ð½Ð°Ñ\87еннÑ\8f Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\96в Ð¼Ð¾Ð´ÐµÐ»Ñ\96 Ð· Ñ\82иповими Ð·Ð½Ð°Ñ\87еннÑ\8fми, Ñ\8fк Ñ\83 ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82а Ð· ID `bar`:
 
 ```Python hl_lines="3  5"
 {
@@ -288,11 +273,12 @@ FastAPI використовує `.dict()` моделі Pydantic з <a href="htt
     "tax": 20.2
 }
 ```
+
 вони будуть включені у відповідь.
 
-#### Дані з тими самими значеннями, що й типові
+#### Дані з тими самими значеннями, що й типові { #data-with-the-same-values-as-the-defaults }
 
-Якщо дані мають ті самі значення, що й типові, як у елемента з item_id `baz`:
+Якщо дані мають ті самі значення, що й типові, як у елемента з ID `baz`:
 
 ```Python hl_lines="3  5-6"
 {
@@ -304,7 +290,7 @@ FastAPI використовує `.dict()` моделі Pydantic з <a href="htt
 }
 ```
 
-FastAPI достатньо розумний (насправді, Pydantic достатньо розумний), щоб зрозуміти, що, хоча `description`, `tax` і `tags` мають ті самі значення, що й типові, вони були встановлені явно (а не взяті як значення за замовчуванням).
+FastAPI достатньо розумний (насправді, Pydantic достатньо розумний), щоб зрозуміти, що, хоча `description`, `tax` і `tags` мають ті самі значення, що й типові, їх було встановлено явно (а не взято як значення за замовчуванням).
 
 Отже, вони будуть включені у JSON-відповідь.
 
@@ -312,24 +298,23 @@ FastAPI достатньо розумний (насправді, Pydantic дос
 
 Зверніть увагу, що типові значення можуть бути будь-якими, не лише `None`.
 
-Це може бути list (`[]`), `float` 10.5 тощо.
+Це може бути list (`[]`), `float` зі значенням `10.5` тощо.
 
 ///
 
-### `response_model_include` та `response_model_exclude`
+### `response_model_include` та `response_model_exclude` { #response-model-include-and-response-model-exclude }
 
 Ви також можете використовувати параметри *декоратора операції шляху* `response_model_include` та `response_model_exclude`.
 
-Вони приймають `set` (множину) рядків (`str`) з іменами атрибутів, які потрібно включити (пропускаючи інші) або виключити (включаючи інші).
+Вони приймають `set` зі `str` з іменами атрибутів, які потрібно включити (пропускаючи решту) або виключити (включаючи решту).
 
-Це Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\8fк Ñ\88видкий Ñ\81поÑ\81Ñ\96б, Ñ\8fкÑ\89о Ñ\83 Ð\92аÑ\81 Ñ\94 Ð»Ð¸Ñ\88е Ð¾Ð´Ð½Ð° Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic Ñ\96 Ð\92и хочете видалити деякі дані з виводу.
+Це Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ñ\8fк Ñ\88видкий Ñ\81поÑ\81Ñ\96б, Ñ\8fкÑ\89о Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ð»Ð¸Ñ\88е Ð¾Ð´Ð½Ð° Ð¼Ð¾Ð´ÐµÐ»Ñ\8c Pydantic Ñ\96 Ð²и хочете видалити деякі дані з виводу.
 
 /// tip | Порада
 
-Але все ж рекомендується використовувати описані вище підходи, із застосуванням кількох класів, замість цих параметрів.
-
+Але все ж рекомендується використовувати описані вище підходи, застосовуючи кілька класів, замість цих параметрів.
 
-Це тому, що JSON Schema, який генерується у вашому OpenAPI додатку (і в документації), все одно буде відповідати повній моделі, навіть якщо Ви використовуєте `response_model_include` або `response_model_exclude` для виключення деяких атрибутів.
+Це тому, що JSON Schema, який генерується в OpenAPI вашого застосунку (і в документації), все одно буде відповідати повній моделі, навіть якщо ви використовуєте `response_model_include` або `response_model_exclude`, щоб пропустити деякі атрибути.
 
 Це також стосується `response_model_by_alias`, який працює подібним чином.
 
@@ -345,14 +330,14 @@ FastAPI достатньо розумний (насправді, Pydantic дос
 
 ///
 
-#### Використання `list` замість `set`
+#### Використання `list` замість `set` { #using-lists-instead-of-sets }
 
-ЯкÑ\89о Ð\92и забудете використати `set` і натомість застосуєте `list` або `tuple`, FastAPI все одно перетворить це на `set`, і все працюватиме правильно:
+ЯкÑ\89о Ð²и забудете використати `set` і натомість застосуєте `list` або `tuple`, FastAPI все одно перетворить це на `set`, і все працюватиме правильно:
 
 {* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}
 
-## Підсумок
+## Підсумок { #recap }
 
-Використовуйте параметр `response_model` *декоратора операції шляху*, щоб визначати моделі відповіді, особливо щоб гарантувати фільтрацію приватних даних.
+Використовуйте параметр `response_model` *декоратора операції шляху*, щоб визначати моделі відповіді і особливо щоб гарантувати фільтрацію приватних даних.
 
 Використовуйте `response_model_exclude_unset`, щоб повертати лише явно встановлені значення.
index 1ed69d6f254b7eb4c3f24082ef53f9c165414c3e..5a08ee46b544e3771cdd82498ccb8c3d6fb199ef 100644 (file)
@@ -1,6 +1,6 @@
-# Ð¡Ñ\82аÑ\82Ñ\83Ñ\81 ÐºÐ¾Ð´Ð¸ Ð\92Ñ\96дповÑ\96дей
+# Ð\9aод Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ð²Ñ\96дповÑ\96дÑ\96 { #response-status-code }
 
-Так само як Ви можете вказати модель відповіді, Ви також можете оголосити HTTP код статусу для відповіді за допомогою параметра `status_code` в будь-якій з *операцій шляху*:
+Так само, як ви можете вказати модель відповіді, ви також можете оголосити HTTP код статусу, що використовується для відповіді, за допомогою параметра `status_code` в будь-якій з *операцій шляху*:
 
 * `@app.get()`
 * `@app.post()`
@@ -8,82 +8,83 @@
 * `@app.delete()`
 * тощо.
 
-{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
+{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
 
-/// note | Ð\9dоÑ\82атка
+/// note | Ð\9fÑ\80имÑ\96тка
 
-Зверніть увагу, що `status_code` є параметром методу "декоратора" (`get`, `post` і т.д.), а не Вашої *функції операції шляху*, як усі інші параметри та тіло запиту.
+Зверніть увагу, що `status_code` є параметром методу «декоратора» (`get`, `post`, тощо). Не вашої *функції операції шляху*, як усі параметри та тіло.
 
 ///
 
-Параметр `status_code` приймає число, яке відповідає HTTP коду статусу.
+Параметр `status_code` приймає число з HTTP кодом статусу.
 
 /// info | Інформація
-`status_code` також може отримувати значення з `IntEnum`, наприклад, з Python <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>.
+
+`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>.
 
 ///
 
 Він буде:
 
-* Повертати вказаний код статусу у відповіді.
-* Документувати його як такий у схемі OpenAPI (і, таким чином, в інтерфейсі користувача):
+* Повертати цей код статусу у відповіді.
+* Документувати його як такий у схемі OpenAPI (і, таким чином, в інтерфейсах користувача):
 
 <img src="/img/tutorial/response-status-code/image01.png">
 
-/// note | Ð\9dоÑ\82атка
+/// note | Ð\9fÑ\80имÑ\96тка
 
 Деякі коди відповіді (див. наступний розділ) вказують, що відповідь не має тіла.
 
-FastAPI знає про це і створить OpenAPI документацію, яка вказує, що тіла відповіді немає.
+FastAPI знає про це і створить документацію OpenAPI, яка вказує, що тіла відповіді немає.
 
 ///
 
-## Про HTTP статус коди
+## Про HTTP коди статусу { #about-http-status-codes }
 
-/// note | Ð\9dоÑ\82атка
+/// note | Ð\9fÑ\80имÑ\96тка
 
-ЯкÑ\89о Ð\92и Ð²Ð¶Ðµ Ð·Ð½Ð°Ñ\94Ñ\82е, Ñ\89о Ñ\82аке HTTP ÐºÐ¾Ð´Ð¸ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83, Ð¿ÐµÑ\80еÑ\85одÑ\8cÑ\82е до наступного розділу.
+ЯкÑ\89о Ð²Ð¸ Ð²Ð¶Ðµ Ð·Ð½Ð°Ñ\94Ñ\82е, Ñ\89о Ñ\82аке HTTP ÐºÐ¾Ð´Ð¸ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83, Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c до наступного розділу.
 
 ///
 
\92 HTTP Ð\92и надсилаєте числовий код статусу з 3 цифр як частину відповіді.
\92 HTTP Ð²и надсилаєте числовий код статусу з 3 цифр як частину відповіді.
 
-ЦÑ\96 ÐºÐ¾Ð´Ð¸ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¿Ð¾Ð²â\80\99Ñ\8fзанÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Ð´Ð»Ñ\8f Ñ\97Ñ\85 Ñ\80озпÑ\96знаваннÑ\8f, Ð°Ð»Ðµ Ð½Ð°Ð¹Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ\96Ñ\88оÑ\8e Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\94 Ñ\81аме число.
+ЦÑ\96 ÐºÐ¾Ð´Ð¸ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¿Ð¾Ð²â\80\99Ñ\8fзанÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Ð´Ð»Ñ\8f Ñ\97Ñ\85 Ñ\80озпÑ\96знаваннÑ\8f, Ð°Ð»Ðµ Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¾Ñ\8e Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\94 число.
 
 Коротко:
 
-* **`100 - 199`** "Інформаційні" відповіді. Ви рідко використовуєте їх напряму. Відповіді з такими кодами не можуть мати тіла.
-* **`200 - 299`** "Успішні" відповіді. Це ті, які Ви використовуватимете найчастіше.
-    * `200` - код за замовчуванням, який означає, що все пройшло "OK".
-    * Ð\86нÑ\88ий Ð¿Ñ\80иклад â\80\93 `201`, "Created" (Ñ\81Ñ\82воÑ\80ено). Його зазвичай використовують після створення нового запису в базі даних.
-    * Ð\9eÑ\81обливий Ð²Ð¸Ð¿Ð°Ð´Ð¾Ðº â\80\93 `204`, "No Content" (немаÑ\94 Ð²Ð¼Ñ\96Ñ\81Ñ\82Ñ\83). Ð¦Ñ\8f Ð²Ñ\96дповÑ\96дÑ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f, ÐºÐ¾Ð»Ð¸ Ð½ÐµÐ¼Ð°Ñ\94 Ð´Ð°Ð½Ð¸Ñ\85 Ð´Ð»Ñ\8f Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\83, тому відповідь не повинна мати тіла.
-* **`300 - 399`** "Перенаправлення". Відповіді з цими кодами можуть мати або не мати тіла, за винятком `304`, "Not Modified" (не змінено), яка не повинна мати тіла.
-* **`400 - 499`** "Помилка клієнта". Це другий тип, який Ви, ймовірно, будете використовувати найчастіше.
-    * Приклад `404`, "Not Found" (не знайдено).
-    * Ð\94лÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº ÐºÐ»Ñ\96Ñ\94нÑ\82а Ð¼Ð¾Ð¶Ð½Ð° використовувати `400`.
-* `500 - 599` "Помилки сервера". Ви майже ніколи не використовуєте їх напряму. Якщо в коді Вашого застосунку або на сервері щось пішло не так, автоматично буде повернено один із цих кодів статусу.
+* `100 - 199` — для «Information». Ви рідко використовуєте їх напряму. Відповіді з такими кодами статусу не можуть мати тіла.
+* **`200 - 299`** — для «Successful» відповідей. Це ті, які ви використовуватимете найчастіше.
+    * `200` — код статусу за замовчуванням, який означає, що все було «OK».
+    * Ð\86нÑ\88ий Ð¿Ñ\80иклад â\80\94 `201`, Â«Created». Його зазвичай використовують після створення нового запису в базі даних.
+    * Ð\9eÑ\81обливий Ð²Ð¸Ð¿Ð°Ð´Ð¾Ðº â\80\94 `204`, Â«No Content». Ð¦Ñ\8e Ð²Ñ\96дповÑ\96дÑ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\82Ñ\8c, ÐºÐ¾Ð»Ð¸ Ð½ÐµÐ¼Ð°Ñ\94 Ð²Ð¼Ñ\96Ñ\81Ñ\82Ñ\83 Ð´Ð»Ñ\8f Ð¿Ð¾Ð²ÐµÑ\80неннÑ\8f ÐºÐ»Ñ\96Ñ\94нÑ\82Ñ\83, Ñ\96 тому відповідь не повинна мати тіла.
+* **`300 - 399`** — для «Redirection». Відповіді з цими кодами статусу можуть мати або не мати тіла, за винятком `304`, «Not Modified», яка не повинна мати тіла.
+* **`400 - 499`** — для відповідей «Client error». Це другий тип, який ви, ймовірно, будете використовувати найчастіше.
+    * Приклад — `404`, для відповіді «Not Found».
+    * Ð\94лÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº Ð· Ð±Ð¾ÐºÑ\83 ÐºÐ»Ñ\96Ñ\94нÑ\82а Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80оÑ\81Ñ\82о використовувати `400`.
+* `500 - 599` — для помилок сервера. Ви майже ніколи не використовуєте їх напряму. Коли щось піде не так у якійсь частині коду вашого застосунку або на сервері, автоматично буде повернено один із цих кодів статусу.
 
 /// tip | Порада
 
-Щоб Ð´Ñ\96знаÑ\82иÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о ÐºÐ¾Ð¶ÐµÐ½ ÐºÐ¾Ð´ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ñ\96 Ð¿Ñ\80изнаÑ\87еннÑ\8f ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ з них, перегляньте документацію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> про HTTP коди статусу</a>.
+Щоб Ð´Ñ\96знаÑ\82иÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о ÐºÐ¾Ð¶ÐµÐ½ ÐºÐ¾Ð´ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83 Ñ\96 Ð´Ð»Ñ\8f Ñ\87ого Ð¿Ñ\80изнаÑ\87ений ÐºÐ¾Ð¶ÐµÐ½ Ñ\96з них, перегляньте документацію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> про HTTP коди статусу</a>.
 
 ///
 
-## Ð\9bегкий Ñ\81поÑ\81Ñ\96б Ð·Ð°Ð¿Ð°Ð¼'Ñ\8fÑ\82аÑ\82и Ð½Ð°Ð·Ð²Ð¸
+## Ð¡ÐºÐ¾Ñ\80оÑ\87еннÑ\8f, Ñ\89об Ð·Ð°Ð¿Ð°Ð¼â\80\99Ñ\8fÑ\82аÑ\82и Ð½Ð°Ð·Ð²Ð¸ { #shortcut-to-remember-the-names }
 
-Розглянемо ще раз попередній приклад:
+Розглянемо попередній приклад ще раз:
 
-{* ../../docs_src/response_status_code/tutorial001.py hl[6] *}
+{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
 
-`201` - це код статусу для "Created" (створено).
+`201` — це код статусу для «Created».
 
\90ле Ð\92ам не потрібно запам'ятовувати, що означає кожен із цих кодів.
\90ле Ð²ам не потрібно запам'ятовувати, що означає кожен із цих кодів.
 
-Ви можете використовувати зручні змінні з `fastapi.status`
+Ви можете використовувати зручні змінні з `fastapi.status`.
 
-{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *}
+{* ../../docs_src/response_status_code/tutorial002_py39.py hl[1,6] *}
 
¦Ñ\96 Ð·Ð¼Ñ\96ннÑ\96 Ð¿Ñ\80оÑ\81Ñ\82о Ð´Ð»Ñ\8f Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96. Ð\92они Ð¼Ñ\96Ñ\81Ñ\82Ñ\8fÑ\82Ñ\8c Ñ\82Ñ\96 Ð¶ Ñ\81амÑ\96 Ñ\87иÑ\81ла, Ð°Ð»Ðµ Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ð°Ð²Ñ\82озаповненнÑ\8fм Ð² Ñ\80едакÑ\82оÑ\80Ñ\96:
\92они â\80\94 Ð¿Ñ\80оÑ\81Ñ\82о Ð´Ð»Ñ\8f Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96, Ð¼Ñ\96Ñ\81Ñ\82Ñ\8fÑ\82Ñ\8c Ñ\82е Ñ\81аме Ñ\87иÑ\81ло, Ð°Ð»Ðµ Ñ\82ак Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ð°Ð²Ñ\82озаповненнÑ\8fм Ñ\80едакÑ\82оÑ\80а, Ñ\89об Ð·Ð½Ð°Ð¹Ñ\82и Ñ\97Ñ\85:
 
 <img src="/img/tutorial/response-status-code/image02.png">
 
@@ -91,10 +92,10 @@ FastAPI знає про це і створить OpenAPI документаці
 
 Ви також можете використати `from starlette import status`.
 
-**FastAPI** надає ті ж самі змінні `starlette.status` як `fastapi.status`, просто для зручності розробника. Однак вони походять безпосередньо зі Starlette.
+**FastAPI** надає той самий `starlette.status` як `fastapi.status` просто як зручність для вас, розробника. Але він походить безпосередньо зі Starlette.
 
 ///
 
-## Зміна значення за замовчуванням
+## Зміна значення за замовчуванням { #changing-the-default }
 
\94алÑ\96, Ñ\83 Ð\9fоÑ\81Ñ\96бникÑ\83 Ð´Ð»Ñ\8f Ð´Ð¾Ñ\81вÑ\96дÑ\87ениÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в{.internal-link target=_blank}, Ð\92и Ð´Ñ\96знаÑ\94Ñ\82еÑ\81Ñ\8c, Ñ\8fк Ð¿Ð¾Ð²ÐµÑ\80нÑ\83Ñ\82и Ñ\96нÑ\88ий ÐºÐ¾Ð´ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83, Ð½Ñ\96ж Ñ\82ой, Ñ\8fкий Ð\92и Ð¾Ð³Ð¾Ð»Ð¾Ñ\81или тут.
\9fÑ\96знÑ\96Ñ\88е, Ñ\83 [Ð\9fоÑ\81Ñ\96бникÑ\83 Ð´Ð»Ñ\8f Ð´Ð¾Ñ\81вÑ\96дÑ\87ениÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в](../advanced/response-change-status-code.md){.internal-link target=_blank}, Ð²Ð¸ Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е, Ñ\8fк Ð¿Ð¾Ð²ÐµÑ\80Ñ\82аÑ\82и Ñ\96нÑ\88ий ÐºÐ¾Ð´ Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\83, Ð½Ñ\96ж Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм, Ñ\8fке Ð²Ð¸ Ð¾Ð³Ð¾Ð»Ð¾Ñ\88Ñ\83Ñ\94Ñ\82е тут.
index 853fd5e659289d3ec1b9f402a7bb11380cfb72ba..54608c2ab168aeb151785a369cc4f5f3910e2e73 100644 (file)
@@ -1,44 +1,22 @@
-# Декларування прикладів вхідних даних
+# Декларування прикладів вхідних даних { #declare-request-example-data }
 
 Ви можете задати приклади даних, які Ваш застосунок може отримувати.
 
 Ось кілька способів, як це зробити.
 
-## Додаткові дані JSON-схеми в моделях Pydantic
+## Додаткові дані JSON-схеми в моделях Pydantic { #extra-json-schema-data-in-pydantic-models }
 
 Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої JSON-схеми.
 
-//// tab | Pydantic v2
-
 {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
 
-////
-
-//// tab | Pydantic v1
-
-{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *}
-
-////
-
-Ця додаткова інформація буде додана як є до **JSON-схеми**, і вона буде використовуватися в документації до API.
-
-//// tab | Pydantic v2
+Ця додаткова інформація буде додана як є до **JSON-схеми** для цієї моделі, і вона буде використана в документації до API.
 
£ Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 Pydantic 2 Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `model_config`, Ñ\8fкий Ð¿Ñ\80иймаÑ\94 `dict`, Ñ\8fк Ð¾Ð¿Ð¸Ñ\81ано Ð² <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">докÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 Pydantic: Ð\9aонÑ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\8f</a>.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82и Ð°Ñ\82Ñ\80ибÑ\83Ñ\82 `model_config`, Ñ\8fкий Ð¿Ñ\80иймаÑ\94 `dict`, Ñ\8fк Ð¾Ð¿Ð¸Ñ\81ано Ð² <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">докÑ\83менÑ\82аÑ\86Ñ\96Ñ\97 Pydantic: Configuration</a>.
 
 Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які Ви хочете відобразити у згенерованій JSON-схемі, включаючи `examples`.
 
-////
-
-//// tab | Pydantic v1
-
-У версії Pydantic 1 використовується внутрішній клас `Config` і параметр `schema_extra`, як описано в <a href="https://docs.pydantic.dev/1.10/usage/schema/#schema-customization" class="external-link" target="_blank">документації Pydantic: Налаштування схеми</a>.
-
-Ви можете задати `schema_extra` як `dict`, що містить будь-які додаткові дані, які Ви хочете бачити у згенерованій JSON-схемі, включаючи `examples`.
-
-////
-
-/// tip | Підказка
+/// tip | Порада
 
 Ви можете використати ту ж техніку, щоб розширити JSON-схему і додати власну додаткову інформацію.
 
 
 OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **JSON-схеми**.
 
-До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з `example`  на `examples`. 🤓
+До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з `example` на `examples`. 🤓
 
 Більше про це можна прочитати в кінці цієї сторінки.
 
 ///
 
-## Додаткові аргументи `Field`
+## Додаткові аргументи `Field` { #field-additional-arguments }
 
 Коли ви використовуєте `Field()` у моделях Pydantic, Ви також можете вказати додаткові `examples`:
 
 {* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
 
-## `examples` у JSON-схемі — OpenAPI
+## `examples` у JSON-схемі — OpenAPI { #examples-in-json-schema-openapi }
 
 При використанні будь-кого з наступного:
 
@@ -76,41 +54,41 @@ OpenAPI 3.1.0 (який використовується починаючи з F
 
 Ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **JSON-схем** у **OpenAPI**.
 
-### `Body` з `examples`
+### `Body` з `examples` { #body-with-examples }
 
 Тут ми передаємо `examples`, які містять один приклад очікуваних даних у `Body()`:
 
 {* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *}
 
-### Приклад у UI документації
+### Приклад у UI документації { #example-in-the-docs-ui }
 
-За допомогою будь-якого з наведених вище методів це виглядатиме так у документації за `/docs`:
+За допомогою будь-якого з наведених вище методів це виглядатиме так у `/docs`:
 
 <img src="/img/tutorial/body-fields/image01.png">
 
-### `Body` з кількома `examples`
+### `Body` з кількома `examples` { #body-with-multiple-examples }
 
 Звичайно, Ви також можете передати кілька `examples`:
 
 {* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *}
 
-Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних.
+Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних тіла.
 
-Втім, на момент написання цього (<abbr title="2023-08-26">26 серпня 2023</abbr>), Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів у **JSON-схеми**. Але нижче можна прочитати про обхідний шлях.
+Втім, на момент написання цього (<abbr title="2023-08-26">час написання цього</abbr>), Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів для даних у **JSON-схемі**. Але нижче можна прочитати про обхідний шлях.
 
-### Специфічні для OpenAPI `examples`
+### Специфічні для OpenAPI `examples` { #openapi-specific-examples }
 
-Ще до того, як **JSON-схема** почала підтримувати `examples`, OpenAPI вже мала підтримку поля з такою ж назвою — `examples`.
+Ще до того, як **JSON-схема** почала підтримувати `examples`, OpenAPI вже мала підтримку іншого поля, яке також називається `examples`.
 
-Це **специфічне для OpenAPI** поле `examples` розміщується в іншій частині специфікації OpenAPI — у **деталях кожної *операції шляху***, а не всередині самої JSON-схеми.
+Це **специфічне для OpenAPI** поле `examples` розміщується в іншому розділі специфікації OpenAPI. Воно розміщується в **деталях кожної *операції шляху***, а не всередині кожної JSON-схеми.
 
-Swagger UI вже давно підтримує це поле `examples`. Тому Ви можете використовувати його, щоб **відображати** кілька **прикладів у документації**.
+І Swagger UI вже давно підтримує це поле `examples`. Тому Ви можете використовувати його, щоб **відображати** різні **приклади в UI документації**.
 
¦Ðµ Ð¿Ð¾Ð»Ðµ `examples` Ñ\83 Ñ\81пеÑ\86иÑ\84Ñ\96каÑ\86Ñ\96Ñ\97 OpenAPI â\80\94 Ñ\86е `dict` (Ñ\81ловник) Ð· **кÑ\96лÑ\8cкома Ð¿Ñ\80икладами** (а Ð½Ðµ Ñ\81пиÑ\81ок `list`), ÐºÐ¾Ð¶ÐµÐ½ Ñ\96з Ñ\8fкиÑ\85 Ð¼Ð¾Ð¶Ðµ Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e, Ñ\89о буде додана до **OpenAPI**.
¤Ð¾Ñ\80ма Ñ\86Ñ\8cого Ñ\81пеÑ\86иÑ\84Ñ\96Ñ\87ного Ð´Ð»Ñ\8f OpenAPI Ð¿Ð¾Ð»Ñ\8f `examples` â\80\94 Ñ\86е `dict` Ð· **кÑ\96лÑ\8cкома Ð¿Ñ\80икладами** (а Ð½Ðµ `list`), ÐºÐ¾Ð¶ÐµÐ½ Ñ\96з Ñ\8fкиÑ\85 Ð¼Ð°Ñ\94 Ð´Ð¾Ð´Ð°Ñ\82ковÑ\83 Ñ\96нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e, Ñ\8fка Ñ\82акож буде додана до **OpenAPI**.
 
\92оно Ð½Ðµ Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ JSON Schema ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð¿Ð°Ñ\80амеÑ\82Ñ\80а, Ð° розміщується зовні, безпосередньо в *операції шляху*.
\92оно Ð½Ðµ Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð²Ñ\81еÑ\80единÑ\83 ÐºÐ¾Ð¶Ð½Ð¾Ñ\97 JSON-Ñ\81Ñ\85еми, Ñ\89о Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8cÑ\81Ñ\8f Ð² OpenAPI, Ð²Ð¾Ð½Ð¾ розміщується зовні, безпосередньо в *операції шляху*.
 
-### Використання параметра `openapi_examples`
+### Використання параметра `openapi_examples` { #using-the-openapi-examples-parameter }
 
 Ви можете оголосити специфічні для OpenAPI `examples` у FastAPI за допомогою параметра `openapi_examples` для:
 
@@ -122,30 +100,32 @@ Swagger UI вже давно підтримує це поле `examples`. Том
 * `Form()`
 * `File()`
 
-Ключі словника (`dict`) ідентифікують кожен приклад, а кожне значення `dict` — кожен специфічний словник `dict` в `examples` може містити:
+Ключі `dict` ідентифікують кожен приклад, а кожне значення — це інший `dict`.
+
+Кожен специфічний `dict` прикладу в `examples` може містити:
 
 * `summary`: короткий опис прикладу.
-* `description`: розгорнутий опис (може містити Markdown).
-* `value`: Ñ\81ам Ð¿Ñ\80иклад, Ð½Ð°Ð¿Ñ\80иклад, Ñ\81ловник (`dict`).
-* `externalValue`: альтернатива `value`, URL-адреса, що вказує на приклад. Проте ця опція може не підтримуватися більшістю інструментів, на відміну від `value`.
+* `description`: розгорнутий опис, який може містити Markdown.
+* `value`: Ñ\86е Ñ\81ам Ð¿Ñ\80иклад, Ñ\8fкий Ð±Ñ\83де Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾, Ð½Ð°Ð¿Ñ\80иклад `dict`.
+* `externalValue`: альтернатива `value`, URL-адреса, що вказує на приклад. Проте це може не підтримуватися такою кількістю інструментів, як `value`.
 
 Використання виглядає так:
 
 {* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
 
-### Приклади OpenAPI у UI документації
+### Приклади OpenAPI в UI документації { #openapi-examples-in-the-docs-ui }
 
-З параметром `openapi_examples`, доданим до `Body()`, документація `/docs` виглядатиме так:
+З `openapi_examples`, доданим до `Body()`, `/docs` виглядатиме так:
 
 <img src="/img/tutorial/body-fields/image02.png">
 
-## Технічні деталі
+## Технічні деталі { #technical-details }
 
-/// tip | Підказка
+/// tip | Порада
 
-Якщо Ви вже використовуєте **FastAPI**  версії **0.99.0 або вище**, Ви можете **пропустити** цей розділ.
+Якщо Ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, Ви, ймовірно, можете **пропустити** ці технічні деталі.
 
ін більш актуальний для старих версій, до появи OpenAPI 3.1.0.
они більш актуальні для старих версій, до появи OpenAPI 3.1.0.
 
 Можна вважати це коротким **історичним екскурсом** у OpenAPI та JSON Schema. 🤓
 
@@ -155,68 +135,68 @@ Swagger UI вже давно підтримує це поле `examples`. Том
 
 Це дуже технічна інформація про стандарти **JSON Schema** і **OpenAPI**.
 
-Якщо вищезгадані ідеї вже працюють у Вас — можете не заглиблюватися в ці деталі.
+Якщо вищезгадані ідеї вже працюють у Вас, цього може бути достатньо, і Вам, ймовірно, не потрібні ці деталі — можете пропустити.
 
 ///
 
-До OpenAPI 3.1.0 специфікація використовувала стару та модифіковану версію **JSON Schema**.
+До OpenAPI 3.1.0 OpenAPI використовував стару та модифіковану версію **JSON Schema**.
 
-Оскільки JSON Schema раніше не підтримувала `examples`, OpenAPI додала власне поле `examples`.
+JSON Schema не мала `examples`, тож OpenAPI додала власне поле `example` до своєї модифікованої версії.
 
-OpenAPI також додала `example` і `examples`  до інших частин специфікації:
+OpenAPI також додала поля `example` і `examples` до інших частин специфікації:
 
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object` (в специфікації)</a> використовується FastAPI для:
+* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object` (в специфікації)</a>, який використовувався утилітами FastAPI:
     * `Path()`
     * `Query()`
     * `Header()`
     * `Cookie()`
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`, в полі `content`, в `Media Type Object` (в специфікації)</a> використовується FastAPI для:
+* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`, у полі `content`, у `Media Type Object` (в специфікації)</a>, який використовувався утилітами FastAPI:
     * `Body()`
     * `File()`
     * `Form()`
 
 /// info | Інформація
 
-Цей старий параметр `examples`, специфічний для OpenAPI, тепер називається `openapi_examples`, починаючи з FastAPI версії `0.103.0`.
+Цей старий специфічний для OpenAPI параметр `examples` тепер називається `openapi_examples`, починаючи з FastAPI `0.103.0`.
 
 ///
 
-### Поле `examples` у JSON Schema
+### Поле `examples` у JSON Schema { #json-schemas-examples-field }
 
 Пізніше JSON Schema додала поле <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a> у нову версію специфікації.
 
\86 Ð²Ð¶Ðµ OpenAPI 3.1.0 Ð±Ð°Ð·Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\86Ñ\96й Ð½Ð¾Ð²Ñ\96й Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 (JSON Schema 2020-12), Ñ\8fка Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 поле `examples`.
\90 Ð¿Ð¾Ñ\82Ñ\96м Ð½Ð¾Ð²Ð¸Ð¹ OpenAPI 3.1.0 Ð±Ð°Ð·Ñ\83вавÑ\81Ñ\8f Ð½Ð° Ð½Ð°Ð¹Ð½Ð¾Ð²Ñ\96Ñ\88Ñ\96й Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 (JSON Schema 2020-12), Ñ\8fка Ð²ÐºÐ»Ñ\8eÑ\87ала Ñ\86е Ð½Ð¾Ð²Ðµ поле `examples`.
 
¢ÐµÐ¿ÐµÑ\80 Ñ\86е Ð¿Ð¾Ð»Ðµ `examples` Ñ\94 Ð¿Ñ\80Ñ\96оÑ\80иÑ\82еÑ\82ним Ñ\96 Ð·Ð°Ð¼Ñ\96нÑ\8eÑ\94 Ñ\81Ñ\82аÑ\80е (Ñ\96 ÐºÐ°Ñ\81Ñ\82омне) Ð¿Ð¾Ð»Ðµ `example`, Ñ\8fке Ñ\81Ñ\82ало застарілим.
\86 Ñ\82епеÑ\80 Ñ\86е Ð½Ð¾Ð²Ðµ Ð¿Ð¾Ð»Ðµ `examples` Ð¼Ð°Ñ\94 Ð²Ð¸Ñ\89ий Ð¿Ñ\80Ñ\96оÑ\80иÑ\82еÑ\82 Ð·Ð° Ñ\81Ñ\82аÑ\80е Ð¾Ð´Ð¸Ð½Ð¾Ñ\87не (Ñ\96 ÐºÐ°Ñ\81Ñ\82омне) Ð¿Ð¾Ð»Ðµ `example`, Ñ\8fке Ñ\82епеÑ\80 Ñ\94 застарілим.
 
\9dове Ð¿Ð¾Ð»Ðµ `examples`  Ñ\83 JSON Schema â\80\94 Ñ\86е **пÑ\80оÑ\81Ñ\82о Ñ\81пиÑ\81ок (`list`)** Ð¿Ñ\80икладÑ\96в, Ð±ÐµÐ· Ð´Ð¾Ð´Ð°Ñ\82ковиÑ\85 Ð¼ÐµÑ\82аданиÑ\85 (на Ð²Ñ\96дмÑ\96нÑ\83 Ð²Ñ\96д OpenAPI).
¦Ðµ Ð½Ð¾Ð²Ðµ Ð¿Ð¾Ð»Ðµ `examples` Ñ\83 JSON Schema â\80\94 Ñ\86е **пÑ\80оÑ\81Ñ\82о `list`** Ð¿Ñ\80икладÑ\96в, Ð° Ð½Ðµ `dict` Ð· Ð´Ð¾Ð´Ð°Ñ\82ковими Ð¼ÐµÑ\82аданими, Ñ\8fк Ð² Ñ\96нÑ\88иÑ\85 Ð¼Ñ\96Ñ\81Ñ\86Ñ\8fÑ\85 OpenAPI (опиÑ\81аниÑ\85 Ð²Ð¸Ñ\89е).
 
 /// info | Інформація
 
\9dавÑ\96Ñ\82Ñ\8c Ð¿Ñ\96Ñ\81лÑ\8f Ñ\82ого, Ñ\8fк Ð·'Ñ\8fвивÑ\81Ñ\8f OpenAPI 3.1.0, Ñ\8fкий Ð¿Ñ\96дÑ\82Ñ\80имÑ\83вав examples Ñ\83 JSON Schema, Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82 Swagger UI Ñ\89е Ð´ÐµÑ\8fкий Ñ\87аÑ\81 Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83вав Ñ\86Ñ\8e Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8e (пÑ\96дÑ\82Ñ\80имка Ð·â\80\99Ñ\8fвилаÑ\81Ñ\8c з версії 5.0.0 🎉).
\9dавÑ\96Ñ\82Ñ\8c Ð¿Ñ\96Ñ\81лÑ\8f Ñ\80елÑ\96зÑ\83 OpenAPI 3.1.0 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð½Ð¾Ð²Ð¾Ñ\8e Ð¿Ñ\80оÑ\81Ñ\82Ñ\96Ñ\88оÑ\8e Ñ\96нÑ\82егÑ\80аÑ\86Ñ\96Ñ\94Ñ\8e Ð· JSON Schema, Ð¿Ñ\80оÑ\82Ñ\8fгом Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ Ñ\87аÑ\81Ñ\83 Swagger UI, Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82, Ñ\8fкий Ð½Ð°Ð´Ð°Ñ\94 Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83вав OpenAPI 3.1.0 (Ñ\82епеÑ\80 Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94, Ð¿Ð¾Ñ\87инаÑ\8eÑ\87и з версії 5.0.0 🎉).
 
 Через це версії FastAPI до 0.99.0 все ще використовували версії OpenAPI нижчі за 3.1.0.
 
 ///
 
-### `Examples` в Pydantic і FastAPI
+### `examples` у Pydantic і FastAPI { #pydantic-and-fastapi-examples }
 
-Коли Ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, ці приклади додаються до **JSON Schema** цієї моделі.
+Коли Ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, цей приклад додається до **JSON Schema** для цієї моделі Pydantic.
 
-І ця **JSON Schema** Pydantic-моделі включається до **OpenAPI** Вашого API, а потім використовується в UI документації (docs UI).
+І ця **JSON Schema** Pydantic-моделі включається до **OpenAPI** Вашого API, а потім використовується в UI документації.
 
-У версіях FastAPI до 0.99.0 (починаючи з 0.99.0 використовується новіший OpenAPI 3.1.0), коли Ви використовували `example` або `examples` з іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до JSON Schema, який описує ці дані (навіть не до власної версії JSON Schema у OpenAPI). Натомість вони додавалися безпосередньо до опису *обробника шляху* *(path operation)* в OpenAPI (тобто поза межами частин, які використовують JSON Schema).
+У версіях FastAPI до 0.99.0 (0.99.0 і вище використовують новіший OpenAPI 3.1.0), коли Ви використовували `example` або `examples` з будь-якими іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до JSON Schema, що описує ці дані (навіть не до власної версії JSON Schema в OpenAPI), натомість вони додавалися безпосередньо до декларації *операції шляху* в OpenAPI (поза межами частин OpenAPI, які використовують JSON Schema).
 
\90ле Ñ\82епеÑ\80, ÐºÐ¾Ð»Ð¸ FastAPI 0.99.0 Ñ\96 Ð²Ð¸Ñ\89е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\82Ñ\8c OpenAPI 3.1.0, Ð° Ñ\82ой â\80\94 JSON Schema 2020-12, Ñ\80азом Ñ\96з Swagger UI 5.0.0 Ñ\96 Ð²Ð¸Ñ\89е â\80\94 Ð²Ñ\81е Ñ\81Ñ\82ало Ð±Ñ\96лÑ\8cÑ\88 Ñ\83згодженим, Ñ\96 examples Ñ\82епеÑ\80 включаються до JSON Schema.
\90ле Ñ\82епеÑ\80, ÐºÐ¾Ð»Ð¸ FastAPI 0.99.0 Ñ\96 Ð²Ð¸Ñ\89е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 OpenAPI 3.1.0, Ñ\8fкий Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 JSON Schema 2020-12, Ñ\96 Swagger UI 5.0.0 Ñ\96 Ð²Ð¸Ñ\89е, Ð²Ñ\81е Ñ\81Ñ\82ало Ð±Ñ\96лÑ\8cÑ\88 Ñ\83згодженим, Ñ\96 Ð¿Ñ\80иклади включаються до JSON Schema.
 
-### Swagger UI та специфічні для OpenAPI `examples`
+### Swagger UI та специфічні для OpenAPI `examples` { #swagger-ui-and-openapi-specific-examples }
 
 Ð°Ð½Ñ\96Ñ\88е (Ñ\81Ñ\82аном Ð½Ð° 26 Ñ\81еÑ\80пнÑ\8f 2023 Ñ\80окÑ\83) Swagger UI Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83вав ÐºÑ\96лÑ\8cка Ð¿Ñ\80икладÑ\96в Ñ\83 JSON Schema, Ñ\82омÑ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96 Ð½Ðµ Ð¼Ð°Ð»Ð¸ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ\81Ñ\82Ñ\96 Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ\82и Ð´Ðµкілька прикладів у документації.
\9eÑ\81кÑ\96лÑ\8cки Swagger UI Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83вав ÐºÑ\96лÑ\8cка Ð¿Ñ\80икладÑ\96в JSON Schema (Ñ\81Ñ\82аном Ð½Ð° 2023-08-26), ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96 Ð½Ðµ Ð¼Ð°Ð»Ð¸ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ\81Ñ\82Ñ\96 Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ\82и кілька прикладів у документації.
 
-Щоб вирішити це, FastAPI починаючи з версії 0.103.0 **додав підтримку** старого **OpenAPI-специфічного** поля `examples` через новий параметр `openapi_examples`. 🤓
+Щоб вирішити це, FastAPI `0.103.0` **додав підтримку** оголошення того самого старого **OpenAPI-специфічного** поля `examples` через новий параметр `openapi_examples`. 🤓
 
-### Підсумок
+### Підсумок { #summary }
 
-РанÑ\96Ñ\88е Ñ\8f ÐºÐ°Ð·Ð°Ð², Ñ\89о Ð½Ðµ Ð»Ñ\8eблÑ\8e Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e... Ð° Ñ\82епеÑ\80 Ð¾Ñ\81Ñ\8c Ñ\8f â\80\94 Ñ\80озповÑ\96даÑ\8e "Ñ\82еÑ\85нÑ\96Ñ\87нÑ\96 Ñ\96Ñ\81Ñ\82оÑ\80иÑ\87нÑ\96" лекції. 😅
+РанÑ\96Ñ\88е Ñ\8f ÐºÐ°Ð·Ð°Ð², Ñ\89о Ð½Ðµ Ð´Ñ\83же Ð»Ñ\8eблÑ\8e Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e... Ð° Ñ\82епеÑ\80 Ð¿Ð¾Ð´Ð¸Ð²Ñ\96Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ð¼ÐµÐ½Ðµ â\80\94 Ñ\87иÑ\82аÑ\8e Â«Ñ\82еÑ\85нÑ\96Ñ\87нÑ\96 Ñ\96Ñ\81Ñ\82оÑ\80иÑ\87нÑ\96» лекції. 😅
 
 Коротко: **оновіться до FastAPI 0.99.0 або вище** — і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і Вам не доведеться знати всі ці історичні деталі. 😎
index c3d94be8d9dc98b79ca727457deef60f2fcc1096..f1fb25178db3503a25cfdc8ee84b8cbbf211efff 100644 (file)
@@ -1,70 +1,72 @@
-# Безпека
+# Безпека { #security }
 
 Існує багато способів реалізувати безпеку, автентифікацію та авторизацію.
 
¦Ðµ Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ñ\81кладна Ñ\96 "непÑ\80оÑ\81Ñ\82а" тема.
\86 Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ñ\86е Ñ\81кладна Ñ\96 Â«Ð½ÐµÐ¿Ñ\80оÑ\81Ñ\82а» тема.
 
-У Ð±Ð°Ð³Ð°Ñ\82Ñ\8cоÑ\85 Ñ\84Ñ\80еймвоÑ\80каÑ\85 Ñ\96 Ñ\81иÑ\81Ñ\82емаÑ\85 Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ\87еннÑ\8f Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ñ\82а Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\97 Ð·Ð°Ð¹Ð¼Ð°Ñ\94 Ð²ÐµÐ»Ð¸Ñ\87езнÑ\83 Ñ\87аÑ\81Ñ\82инÑ\83 Ð·Ñ\83Ñ\81илÑ\8c Ñ\96 ÐºÐ¾Ð´Ñ\83 (Ñ\96нодÑ\96 â\80\94 Ð¿Ð¾Ð½Ð°Ð´ 50% Ð²сього написаного коду).
+У Ð±Ð°Ð³Ð°Ñ\82Ñ\8cоÑ\85 Ñ\84Ñ\80еймвоÑ\80каÑ\85 Ñ\96 Ñ\81иÑ\81Ñ\82емаÑ\85 Ð»Ð¸Ñ\88е Ð¾Ð±Ñ\80обка Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ñ\82а Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\97 Ð¿Ð¾Ñ\82Ñ\80ебÑ\83Ñ\94 Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ\85 Ð·Ñ\83Ñ\81илÑ\8c Ñ\96 ÐºÐ¾Ð´Ñ\83 (Ñ\83 Ð±Ð°Ð³Ð°Ñ\82Ñ\8cоÑ\85 Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ\85 Ñ\86е Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и 50% Ð°Ð±Ð¾ Ð±Ñ\96лÑ\8cÑ\88е Ð²Ñ\96д Ñ\83сього написаного коду).
 
-**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в, Ñ\8fкÑ\96 Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð\92ам Ð²Ð¿Ð¾Ñ\80аÑ\82иÑ\81Ñ\8f з **безпекою** легко, швидко, стандартним способом, без необхідності вивчати всі специфікації безпеки.
+**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в, Ñ\8fкÑ\96 Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð²Ð°Ð¼ Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и з **безпекою** легко, швидко, стандартним способом, без необхідності вивчати всі специфікації безпеки.
 
-Але спочатку — кілька коротких понять.
+Але спочатку розгляньмо кілька невеликих понять.
 
-## Поспішаєте?
+## Поспішаєте? { #in-a-hurry }
 
-ЯкÑ\89о Ð\92ам Ð½Ðµ Ñ\86Ñ\96кавÑ\96 Ð²Ñ\81Ñ\96 Ñ\86Ñ\96 Ñ\82еÑ\80мÑ\96ни Ð¹ Ð¿Ñ\80оÑ\81Ñ\82о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно *Ñ\88видко* Ð´Ð¾Ð´Ð°Ñ\82и Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\8e Ð·Ð° Ð»Ð¾Ð³Ñ\96ном Ñ\96 Ð¿Ð°Ñ\80олем â\80\94 переходьте до наступних розділів.
+ЯкÑ\89о Ð²Ð°Ð¼ Ð½Ðµ Ñ\86Ñ\96кавÑ\96 Ð²Ñ\81Ñ\96 Ñ\86Ñ\96 Ñ\82еÑ\80мÑ\96ни Ð¹ Ð²Ð°Ð¼ Ð¿Ñ\80оÑ\81Ñ\82о Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð´Ð¾Ð´Ð°Ñ\82и Ð±ÐµÐ·Ð¿ÐµÐºÑ\83 Ð· Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\94Ñ\8e Ð½Ð° Ð¾Ñ\81новÑ\96 Ñ\96менÑ\96 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ñ\82а Ð¿Ð°Ñ\80олÑ\8f *пÑ\80Ñ\8fмо Ð·Ð°Ñ\80аз*, переходьте до наступних розділів.
 
-## OAuth2
+## OAuth2 { #oauth2 }
 
-OAuth2 â\80\94 Ñ\86е Ñ\81пеÑ\86иÑ\84Ñ\96каÑ\86Ñ\96Ñ\8f, Ñ\89о Ð¾Ð¿Ð¸Ñ\81Ñ\83є кілька способів обробки автентифікації та авторизації.
+OAuth2 â\80\94 Ñ\86е Ñ\81пеÑ\86иÑ\84Ñ\96каÑ\86Ñ\96Ñ\8f, Ñ\89о Ð²Ð¸Ð·Ð½Ð°Ñ\87ає кілька способів обробки автентифікації та авторизації.
 
-Це досить об'ємна специфікація, яка охоплює складні випадки використання.
+Це досить об'ємна специфікація, яка охоплює кілька складних випадків використання.
 
-Вона включає способи автентифікації через "третю сторону".
+Вона включає способи автентифікації через «третю сторону».
 
-Саме це лежить в основі "входу через Google, Facebook, X (Twitter), GitHub" тощо.
+Саме це лежить в основі всіх систем із «увійти через Facebook, Google, X (Twitter), GitHub».
 
-### OAuth 1
+### OAuth 1 { #oauth-1 }
 
-Раніше існував OAuth 1, який значно відрізняється від OAuth2 і є складнішим, оскільки містив специфікації для шифрування комунікацій.
+Раніше існував OAuth 1, який значно відрізняється від OAuth2 і є складнішим, оскільки містив прямі специфікації щодо того, як шифрувати комунікацію.
 
\97аÑ\80аз Ð¼Ð°Ð¹Ð¶Ðµ Ð½Ðµ використовується.
\97аÑ\80аз Ð²Ñ\96н Ð½Ðµ Ð´Ñ\83же Ð¿Ð¾Ð¿Ñ\83лÑ\8fÑ\80ний Ð°Ð±Ð¾ використовується.
 
-OAuth2 Ð½Ðµ Ð²ÐºÐ°Ð·Ñ\83Ñ\94, Ñ\8fк Ñ\81аме Ñ\88иÑ\84Ñ\80Ñ\83ваÑ\82и Ð·'Ñ\94днаннÑ\8f â\80\94 Ð²Ð¾Ð½Ð¾ Ð¾Ñ\87Ñ\96кÑ\83Ñ\94, Ñ\89о Ð²Ð°Ñ\88 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нок Ð¿Ñ\80аÑ\86Ñ\8eÑ\94 через HTTPS.
+OAuth2 Ð½Ðµ Ð²ÐºÐ°Ð·Ñ\83Ñ\94, Ñ\8fк Ñ\81аме Ñ\88иÑ\84Ñ\80Ñ\83ваÑ\82и ÐºÐ¾Ð¼Ñ\83нÑ\96каÑ\86Ñ\96Ñ\8e â\80\94 Ð²Ñ\96н Ð¾Ñ\87Ñ\96кÑ\83Ñ\94, Ñ\89о Ð²Ð°Ñ\88 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нок Ð´Ð¾Ñ\81Ñ\82Ñ\83пний через HTTPS.
 
 /// tip | Порада
 
-У Ñ\80оздÑ\96лÑ\96 Ð¿Ñ\80о **деплой** Ð\92и побачите, як налаштувати HTTPS безкоштовно з Traefik та Let's Encrypt.
+У Ñ\80оздÑ\96лÑ\96 Ð¿Ñ\80о **деплой** Ð²и побачите, як налаштувати HTTPS безкоштовно з Traefik та Let's Encrypt.
 
 ///
 
-## OpenID Connect
+## OpenID Connect { #openid-connect }
 
 OpenID Connect — ще одна специфікація, побудована на основі **OAuth2**.
 
-Вона розширює OAuth2, уточнюючи деякі неоднозначності для досягнення кращої сумісності.
+Вона просто розширює OAuth2, уточнюючи деякі відносно неоднозначні речі в OAuth2, щоб зробити його більш сумісним.
 
\9dапÑ\80иклад, Ð²Ñ\85Ñ\96д Ñ\87еÑ\80ез Google Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 OpenID Connect (Ñ\8fкий Ð±Ð°Ð·Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° OAuth2).
\9dапÑ\80иклад, Ð²Ñ\85Ñ\96д Ñ\87еÑ\80ез Google Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 OpenID Connect (Ñ\8fкий Ð¿Ñ\96д ÐºÐ°Ð¿Ð¾Ñ\82ом Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94 OAuth2).
 
-Але вхід через Facebook — ні. Він має власну реалізацію на базі OAuth2.
+Але вхід через Facebook не підтримує OpenID Connect. Він має власний різновид OAuth2.
 
-### OpenID (не "OpenID Connect")
+### OpenID (не «OpenID Connect») { #openid-not-openid-connect }
 
-Існувала також специфікація "OpenID", яка намагалася розвʼязати ті самі задачі, що й **OpenID Connect**, але не базувалась на OAuth2.
+Існувала також специфікація «OpenID». Вона намагалася розвʼязати те саме, що й **OpenID Connect**, але не базувалась на OAuth2.
 
¦Ðµ Ð±Ñ\83ла Ð·Ð¾Ð²Ñ\81Ñ\96м Ñ\96нÑ\88а Ñ\81иÑ\81Ñ\82ема, Ñ\96 Ñ\81Ñ\8cогоднÑ\96 Ð²Ð¾Ð½Ð° Ð¼Ð°Ð¹Ð¶Ðµ Ð½Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f.
¢Ð¾Ð¶ Ñ\86е Ð±Ñ\83ла Ð¿Ð¾Ð²Ð½Ñ\96Ñ\81Ñ\82Ñ\8e Ð´Ð¾Ð´Ð°Ñ\82кова Ñ\81иÑ\81Ñ\82ема.
 
-## OpenAPI
+Зараз вона не дуже популярна або використовується.
 
-OpenAPI (раніше Swagger) — це специфікація для побудови API (тепер під егідою Linux Foundation).
+## OpenAPI { #openapi }
+
+OpenAPI (раніше відомий як Swagger) — це відкрита специфікація для побудови API (тепер частина Linux Foundation).
 
 **FastAPI** базується на **OpenAPI**.
 
\97авдÑ\8fки Ñ\86Ñ\8cомÑ\83 Ð\92и Ð¾Ñ\82Ñ\80имÑ\83Ñ\94Ñ\82е Ð°Ð²Ñ\82омаÑ\82иÑ\87нÑ\83 Ñ\96нÑ\82еÑ\80акÑ\82ивнÑ\83 Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\8e, Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\8e ÐºÐ¾Ð´Ñ\83 Ñ\82а Ð±Ð°Ð³Ð°Ñ\82о Ñ\96нÑ\88ого.
¡Ð°Ð¼Ðµ Ñ\86е Ñ\80обиÑ\82Ñ\8c Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¸Ð¼Ð¸ ÐºÑ\96лÑ\8cка Ð°Ð²Ñ\82омаÑ\82иÑ\87ниÑ\85 Ñ\96нÑ\82еÑ\80акÑ\82ивниÑ\85 Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81Ñ\96в Ð´Ð¾ÐºÑ\83менÑ\82аÑ\86Ñ\96Ñ\97, Ð³ÐµÐ½ÐµÑ\80аÑ\86Ñ\96Ñ\8e ÐºÐ¾Ð´Ñ\83 Ñ\82оÑ\89о.
 
-OpenAPI Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94 Ð¾Ð¿Ð¸Ñ\81Ñ\83ваÑ\82и Ñ\80Ñ\96знÑ\96 "Ñ\81Ñ\85еми" безпеки.
+OpenAPI Ð¼Ð°Ñ\94 Ñ\81поÑ\81Ñ\96б Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\82и Ñ\80Ñ\96знÑ\96 Â«Ñ\81Ñ\85еми» безпеки.
 
\92икоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\97Ñ\85, Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ð²Ñ\81Ñ\96ма Ñ\86ими Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ами, Ñ\89о Ð±Ð°Ð·Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82аÑ\85, Ð·Ð¾ÐºÑ\80ема інтерактивними системами документації.
\92икоÑ\80иÑ\81Ñ\82овÑ\83Ñ\8eÑ\87и Ñ\97Ñ\85, Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ð²Ñ\81Ñ\96ма Ñ\86ими Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ами, Ñ\89о Ð±Ð°Ð·Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82аÑ\85, Ð·Ð¾ÐºÑ\80ема Ñ\86ими інтерактивними системами документації.
 
 OpenAPI визначає такі схеми безпеки:
 
@@ -72,33 +74,33 @@ OpenAPI визначає такі схеми безпеки:
     * Параметр запиту.
     * Заголовок.
     * Cookie.
-* `http`: стандартні методи HTTP-автентифікації, включаючи:
-    * `bearer`: заголовок `Authorization` зі значенням `Bearer` та токеном. Це успадковано з OAuth2.
-    * HTTP Basic Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\8f
-    * HTTP Digest, тощо.
+* `http`: стандартні системи HTTP-автентифікації, включаючи:
+    * `bearer`: заголовок `Authorization` зі значенням `Bearer ` та токеном. Це успадковано з OAuth2.
+    * HTTP Basic Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\8e.
+    * HTTP Digest тощо.
 * `oauth2`: усі способи обробки безпеки за допомогою OAuth2 (так звані «потоки»).
-    * Деякі з цих потоків підходять для створення власного провайдера автентифікації OAuth 2.0 (наприклад, Google, Facebook, X (Twitter), GitHub тощо):
-        * `implicit`— неявний
-        * `clientCredentials`— облікові дані клієнта
-        * `authorizationCode` — код авторизації
-    * Але є один окремий «потік», який ідеально підходить для реалізації автентифікації всередині одного додатку:
-        * `password`: Ñ\83 Ð½Ð°Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\80оздÑ\96лаÑ\85 Ð±Ñ\83де Ð¿Ñ\80иклад Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f Ñ\86Ñ\8cого Ð¿Ð¾Ñ\82окÑ\83.
-* `openIdConnect`: Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94 Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð²Ð¸Ñ\8fвлÑ\8fÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80и автентифікації OAuth2.
-    * Ð¦Ðµ Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð²Ð¸Ñ\8fвленнÑ\8f Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f у специфікації OpenID Connect.
+    * Декілька з цих потоків підходять для створення провайдера автентифікації OAuth 2.0 (наприклад, Google, Facebook, X (Twitter), GitHub тощо):
+        * `implicit`
+        * `clientCredentials`
+        * `authorizationCode`
+    * Але є один окремий «потік», який можна ідеально використати для обробки автентифікації напряму в цьому ж застосунку:
+        * `password`: Ñ\83 ÐºÑ\96лÑ\8cкоÑ\85 Ð½Ð°Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\80оздÑ\96лаÑ\85 Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð¿Ñ\80иклади Ñ\86Ñ\8cого.
+* `openIdConnect`: Ð¼Ð°Ñ\94 Ñ\81поÑ\81Ñ\96б Ð²Ð¸Ð·Ð½Ð°Ñ\87иÑ\82и, Ñ\8fк Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð²Ð¸Ñ\8fвлÑ\8fÑ\82и Ð´Ð°Ð½Ñ\96 автентифікації OAuth2.
+    * Ð¡Ð°Ð¼Ðµ Ñ\86е Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð²Ð¸Ñ\8fвленнÑ\8f Ð²Ð¸Ð·Ð½Ð°Ñ\87ено у специфікації OpenID Connect.
 
 
 /// tip | Порада
 
-Інтеграція інших провайдерів автентифікації/авторизації, таких як Google, Facebook, X (Twitter), GitHub тощо — також можлива і відносно проста.
+Інтеграція інших провайдерів автентифікації/авторизації, таких як Google, Facebook, X (Twitter), GitHub тощо, також можлива і відносно проста.
 
\9dайÑ\81кладнÑ\96Ñ\88е â\80\94 Ñ\86е Ñ\81Ñ\82воÑ\80иÑ\82и Ð²Ð»Ð°Ñ\81ного Ð¿Ñ\80овайдеÑ\80а Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\97/авÑ\82оÑ\80изаÑ\86Ñ\96Ñ\97, Ñ\8fк Google Ñ\87и Facebook. Ð\90ле **FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ð\92ам Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и, Ñ\89об Ð·Ñ\80обиÑ\82и Ñ\86е Ð»ÐµÐ³ÐºÐ¾, Ð±ÐµÑ\80Ñ\83Ñ\87и Ð½Ð° Ñ\81ебе Ð²Ð°Ð¶ÐºÑ\83 Ñ\87аÑ\81Ñ\82инÑ\83 Ñ\80обоÑ\82и.
\9dайÑ\81кладнÑ\96Ñ\88е â\80\94 Ñ\86е Ñ\81Ñ\82воÑ\80иÑ\82и Ð¿Ñ\80овайдеÑ\80а Ð°Ð²Ñ\82енÑ\82иÑ\84Ñ\96каÑ\86Ñ\96Ñ\97/авÑ\82оÑ\80изаÑ\86Ñ\96Ñ\97 Ð½Ð° ÐºÑ\88Ñ\82алÑ\82 Ñ\82акиÑ\85, Ð°Ð»Ðµ **FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ð²Ð°Ð¼ Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и, Ñ\89об Ð·Ñ\80обиÑ\82и Ñ\86е Ð»ÐµÐ³ÐºÐ¾, Ð²Ð¸ÐºÐ¾Ð½Ñ\83Ñ\8eÑ\87и Ð²Ð°Ð¶ÐºÑ\83 Ñ\87аÑ\81Ñ\82инÑ\83 Ñ\80обоÑ\82и Ð·Ð° Ð²Ð°Ñ\81.
 
 ///
 
-## Ð\86нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82и **FastAPI**
+## Ð£Ñ\82илÑ\96Ñ\82и **FastAPI** { #fastapi-utilities }
 
-FastAPI Ð½Ð°Ð´Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в Ð´Ð»Ñ\8f ÐºÐ¾Ð¶Ð½Ð¾Ñ\97 Ð· Ð¾Ð¿Ð¸Ñ\81аниÑ\85 Ñ\81Ñ\85ем Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ð² Ð¼Ð¾Ð´Ñ\83лÑ\96 `fastapi.security`, Ñ\8fкÑ\96 Ñ\81пÑ\80оÑ\89Ñ\83Ñ\8eÑ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f Ñ\86иÑ\85 Ð¼ÐµÑ\85анÑ\96змÑ\96в Ð·Ð°Ñ\85иÑ\81Ñ\82Ñ\83.
+FastAPI Ð½Ð°Ð´Ð°Ñ\94 ÐºÑ\96лÑ\8cка Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в Ð´Ð»Ñ\8f ÐºÐ¾Ð¶Ð½Ð¾Ñ\97 Ð· Ð¾Ð¿Ð¸Ñ\81аниÑ\85 Ñ\81Ñ\85ем Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ð² Ð¼Ð¾Ð´Ñ\83лÑ\96 `fastapi.security`, Ñ\8fкÑ\96 Ñ\81пÑ\80оÑ\89Ñ\83Ñ\8eÑ\82Ñ\8c Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82аннÑ\8f Ñ\86иÑ\85 Ð¼ÐµÑ\85анÑ\96змÑ\96в Ð±ÐµÐ·Ð¿ÐµÐºÐ¸.
 
-У Ð½Ð°Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\80оздÑ\96лаÑ\85 Ð\92и Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е, Ñ\8fк Ð´Ð¾Ð´Ð°Ñ\82и Ð±ÐµÐ·Ð¿ÐµÐºÑ\83 Ð´Ð¾ Ñ\81вого API Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Ñ\86иÑ\85 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в **FastAPI**.
+У Ð½Ð°Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\80оздÑ\96лаÑ\85 Ð²Ð¸ Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82е, Ñ\8fк Ð´Ð¾Ð´Ð°Ñ\82и Ð±ÐµÐ·Ð¿ÐµÐºÑ\83 Ð´Ð¾ Ñ\81вого API Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Ñ\86иÑ\85 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83менÑ\82Ñ\96в, Ñ\8fкÑ\96 Ð½Ð°Ð´Ð°Ñ\94 **FastAPI**.
 
-А також побачите, як вона автоматично інтегрується в інтерактивну документацію вашого API.
+А також побачите, як це автоматично інтегрується в інтерактивну систему документації.
index 3427f2376564290d958720c68eee35b6810f3b4c..32ca1311d264eec880a3d7aa638dcf41abee177b 100644 (file)
@@ -1,13 +1,13 @@
-# Статичні файли
+# Статичні файли { #static-files }
 
 Ви можете автоматично надавати статичні файли з каталогу, використовуючи `StaticFiles`.
 
-## Використання `StaticFiles`
+## Використання `StaticFiles` { #use-staticfiles }
 
 * Імпортуйте `StaticFiles`.
-* "Під'єднати" екземпляр `StaticFiles()` з вказанням необхідного шляху.
+* «Під'єднати» екземпляр `StaticFiles()` з вказанням необхідного шляху.
 
-{* ../../docs_src/static_files/tutorial001.py hl[2,6] *}
+{* ../../docs_src/static_files/tutorial001_py39.py hl[2,6] *}
 
 /// note | Технічні деталі
 
 
 ///
 
-### Що таке "Під'єднання"
+### Що таке «Під'єднання» { #what-is-mounting }
 
-"Під'єднання" означає додавання повноцінного "незалежного" застосунку за певним шляхом, який потім обробляє всі під шляхи.
+«Під'єднання» означає додавання повноцінного «незалежного» застосунку за певним шляхом, який потім обробляє всі під шляхи.
 
-Це відрізняється від використання `APIRouter`, оскільки під'єднаний застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не будуть знати нічого про ваш під'єднаний застосунок.
+Це відрізняється від використання `APIRouter`, оскільки під'єднаний застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не будуть знати нічого про ваш під'єднаний застосунок тощо.
 
 Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md){.internal-link target=_blank}.
 
-## Деталі
+## Деталі { #details }
 
-Перше `"/static"` вказує на під шлях, за яким буде "під'єднано" цей новий "застосунок". Тому будь-який шлях, який починається з `"/static"`, буде оброблятися ним.
+Перше `"/static"` вказує на під шлях, за яким буде «під'єднано» цей новий «підзастосунок». Тому будь-який шлях, який починається з `"/static"`, буде оброблятися ним.
 
-`directory="static"` Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94 ÐºÐ°Ñ\82алог, що містить ваші статичні файли.
+`directory="static"` Ð²Ð¸Ð·Ð½Ð°Ñ\87аÑ\94 Ð½Ð°Ð·Ð²Ñ\83 ÐºÐ°Ñ\82алогÑ\83, що містить ваші статичні файли.
 
 `name="static"` це ім'я, яке можна використовувати всередині **FastAPI**.
 
-Усі ці параметри можуть бути змінені відповідно до потреб і особливостей вашого застосунку.
+Усі ці параметри можуть бути іншими за "`static`", налаштуйте їх відповідно до потреб і особливостей вашого застосунку.
 
-## Додаткова інформація
+## Додаткова інформація { #more-info }
 
 Детальніше про налаштування та можливості можна дізнатися в <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">документації Starlette про статичні файли</a>.
index 1105c6b0a8f7f1a9e4cebb18462451beb193dd9d..462592829f24654e6bf74a2bdd08f468e6764637 100644 (file)
@@ -1,17 +1,18 @@
-# Тестування
+# Тестування { #testing }
 
-Тестування **FastAPI**  додатків є простим та ефективним завдяки бібліотеці <a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a>, яка базується на <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>.
-Оскільки HTTPX розроблений на основі Requests, його API є інтуїтивно зрозумілим для тих, хто вже знайомий з Requests.
+Завдяки <a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a> тестувати застосунки **FastAPI** просто й приємно.
 
\97 Ð¹Ð¾Ð³Ð¾ Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ\8e Ð\92и Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> Ð±ÐµÐ·Ð¿Ð¾Ñ\81еÑ\80еднÑ\8cо Ð· **FastAPI**.
\92оно Ð±Ð°Ð·Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, Ñ\8fкий, Ñ\81воÑ\94Ñ\8e Ñ\87еÑ\80гоÑ\8e, Ñ\81пÑ\80оÑ\94кÑ\82ований Ð½Ð° Ð¾Ñ\81новÑ\96 Requests, Ñ\82ож Ð²Ñ\96н Ð´Ñ\83же Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð¸Ð¹ Ñ\82а Ñ\96нÑ\82Ñ\83Ñ\97Ñ\82ивно Ð·Ñ\80озÑ\83мÑ\96лий.
 
-## Використання `TestClient`
+З його допомогою ви можете використовувати <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> безпосередньо з **FastAPI**.
+
+## Використання `TestClient` { #using-testclient }
 
 /// info | Інформація
 
 Щоб використовувати `TestClient`, спочатку встановіть <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð²Ñ\81Ñ\82ановили Ñ\81амÑ\83 Ð±Ñ\96блÑ\96оÑ\82екÑ\83, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²Ð¸ Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, Ð°ÐºÑ\82ивÑ\83вали Ð¹Ð¾Ð³Ð¾, Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð²Ñ\81Ñ\82ановили `httpx`, наприклад:
 
 ```console
 $ pip install httpx
@@ -21,7 +22,7 @@ $ pip install httpx
 
 Імпортуйте `TestClient`.
 
-СÑ\82воÑ\80Ñ\96Ñ\82Ñ\8c `TestClient`, Ð¿ÐµÑ\80едавÑ\88и Ð¹Ð¾Ð¼Ñ\83 Ð\92аш застосунок **FastAPI**.
+СÑ\82воÑ\80Ñ\96Ñ\82Ñ\8c `TestClient`, Ð¿ÐµÑ\80едавÑ\88и Ð¹Ð¾Ð¼Ñ\83 Ð²аш застосунок **FastAPI**.
 
 Створюйте функції з іменами, що починаються з `test_` (це стандартна угода для `pytest`).
 
@@ -29,8 +30,7 @@ $ pip install httpx
 
 Записуйте прості `assert`-вирази зі стандартними виразами Python, які потрібно перевірити (це також стандарт для `pytest`).
 
-{* ../../docs_src/app_testing/tutorial001.py hl[2,12,15:18] *}
-
+{* ../../docs_src/app_testing/tutorial001_py39.py hl[2,12,15:18] *}
 
 /// tip | Порада
 
@@ -46,25 +46,25 @@ $ pip install httpx
 
 Ви також можете використовувати `from starlette.testclient import TestClient`.
 
-**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ñ\82ой Ñ\81амий `starlette.testclient` Ð¿Ñ\96д Ð½Ð°Ð·Ð²Ð¾Ñ\8e `fastapi.testclient` Ð´Ð»Ñ\8f Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96 Ñ\80озÑ\80обникÑ\96в, Ð°ле він безпосередньо походить із Starlette.
+**FastAPI** Ð½Ð°Ð´Ð°Ñ\94 Ñ\82ой Ñ\81амий `starlette.testclient` Ð¿Ñ\96д Ð½Ð°Ð·Ð²Ð¾Ñ\8e `fastapi.testclient` Ð¿Ñ\80оÑ\81Ñ\82о Ð´Ð»Ñ\8f Ð·Ñ\80Ñ\83Ñ\87ноÑ\81Ñ\82Ñ\96 Ð´Ð»Ñ\8f Ð²Ð°Ñ\81, Ñ\80озÑ\80обника. Ð\90ле він безпосередньо походить із Starlette.
 
 ///
 
 /// tip | Порада
 
-ЯкÑ\89о Ð\92ам Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\82и `async`-Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\83 Ð²Ð°Ñ\88иÑ\85 Ñ\82еÑ\81Ñ\82аÑ\85, Ð¾ÐºÑ\80Ñ\96м Ð²Ñ\96дпÑ\80авленнÑ\8f Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96в Ð´Ð¾ FastAPI-заÑ\81Ñ\82оÑ\81Ñ\83нкÑ\83 (напÑ\80иклад, Ð°Ñ\81инÑ\85Ñ\80оннÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\80обоÑ\82и Ð· Ð±Ð°Ð·Ð¾Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85), Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е [Ð\90Ñ\81инÑ\85Ñ\80оннÑ\96 Ñ\82еÑ\81Ñ\82и](../advanced/async-tests.md){.internal-link target=_blank} у розширеному керівництві.
+ЯкÑ\89о Ð²Ð¸ Ñ\85оÑ\87еÑ\82е Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ\82и `async`-Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\83 Ð²Ð°Ñ\88иÑ\85 Ñ\82еÑ\81Ñ\82аÑ\85, Ð¾ÐºÑ\80Ñ\96м Ð²Ñ\96дпÑ\80авленнÑ\8f Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96в Ð´Ð¾ Ð²Ð°Ñ\88ого Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нкÑ\83 FastAPI (напÑ\80иклад, Ð°Ñ\81инÑ\85Ñ\80оннÑ\96 Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 Ñ\80обоÑ\82и Ð· Ð±Ð°Ð·Ð¾Ñ\8e Ð´Ð°Ð½Ð¸Ñ\85), Ð¿ÐµÑ\80еглÑ\8fнÑ\8cÑ\82е [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} у розширеному керівництві.
 
 ///
 
-## Розділення тестів
+## Розділення тестів { #separating-tests }
 
-У Ñ\80еалÑ\8cномÑ\83 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нкÑ\83 Ð\92аші тести, ймовірно, будуть в окремому файлі.
+У Ñ\80еалÑ\8cномÑ\83 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нкÑ\83 Ð²аші тести, ймовірно, будуть в окремому файлі.
 
-Також Ð\92аÑ\88 **FastAPI**-заÑ\81Ñ\82оÑ\81Ñ\83нок Ð¼Ð¾Ð¶Ðµ Ñ\81кладаÑ\82иÑ\81Ñ\8f Ð· ÐºÑ\96лÑ\8cкоÑ\85 Ñ\84айлÑ\96в Ð°Ð±Ð¾ модулів тощо.
+Також Ð²Ð°Ñ\88 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нок **FastAPI** Ð¼Ð¾Ð¶Ðµ Ñ\81кладаÑ\82иÑ\81Ñ\8f Ð· ÐºÑ\96лÑ\8cкоÑ\85 Ñ\84айлÑ\96в/модулів тощо.
 
-### Файл застосунку **FastAPI**
+### Файл застосунку **FastAPI** { #fastapi-app-file }
 
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\83 Ð\92аÑ\81 Ñ\94 Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80а Ñ\84айлÑ\96в, Ð¾Ð¿Ð¸Ñ\81ана Ð² Ñ\80оздÑ\96лÑ\96 [Ð\91Ñ\96лÑ\8cÑ\88Ñ\96 Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нки](bigger-applications.md){.internal-link target=_blank}:
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\83 Ð²Ð°Ñ\81 Ñ\94 Ñ\81Ñ\82Ñ\80Ñ\83кÑ\82Ñ\83Ñ\80а Ñ\84айлÑ\96в, Ð¾Ð¿Ð¸Ñ\81ана Ð² Ñ\80оздÑ\96лÑ\96 [Bigger Applications](bigger-applications.md){.internal-link target=_blank}:
 
 ```
 .
@@ -72,14 +72,15 @@ $ pip install httpx
 │   ├── __init__.py
 │   └── main.py
 ```
-У файлі `main.py` знаходиться Ваш застосунок **FastAPI** :
 
-{* ../../docs_src/app_testing/main.py *}
+У файлі `main.py` знаходиться ваш застосунок **FastAPI**:
 
-### Файл тестування
 
-Ви можете створити файл `test_main.py` з Вашими тестами. Він може знаходитися в тому ж пакеті Python (у тій самій директорії з файлом `__init__.py`):
+{* ../../docs_src/app_testing/app_a_py39/main.py *}
 
+### Файл тестування { #testing-file }
+
+Ви можете створити файл `test_main.py` з вашими тестами. Він може знаходитися в тому ж пакеті Python (у тій самій директорії з файлом `__init__.py`):
 
 ``` hl_lines="5"
 .
@@ -89,18 +90,18 @@ $ pip install httpx
 │   └── test_main.py
 ```
 
\9eÑ\81кÑ\96лÑ\8cки Ñ\86ей Ñ\84айл Ð·Ð½Ð°Ñ\85одиÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\82омÑ\83 Ð¶ Ð¿Ð°ÐºÐµÑ\82Ñ\96, Ð\92и можете використовувати відносний імпорт, щоб імпортувати об'єкт `app`  із модуля `main` (`main.py`):
\9eÑ\81кÑ\96лÑ\8cки Ñ\86ей Ñ\84айл Ð·Ð½Ð°Ñ\85одиÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\82омÑ\83 Ð¶ Ð¿Ð°ÐºÐµÑ\82Ñ\96, Ð²и можете використовувати відносний імпорт, щоб імпортувати об'єкт `app`  із модуля `main` (`main.py`):
 
-{* ../../docs_src/app_testing/test_main.py hl[3] *}
+{* ../../docs_src/app_testing/app_a_py39/test_main.py hl[3] *}
 
 
 ...і написати код для тестів так само як і раніше.
 
-## Тестування: розширений приклад
+## Тестування: розширений приклад { #testing-extended-example }
 
 Тепер розширимо цей приклад і додамо більше деталей, щоб побачити, як тестувати різні частини.
 
-### Розширений файл застосунку **FastAPI**
+### Розширений файл застосунку **FastAPI** { #extended-fastapi-app-file }
 
 Залишимо ту саму структуру файлів:
 
@@ -112,75 +113,26 @@ $ pip install httpx
 │   └── test_main.py
 ```
 
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\89о Ñ\82епеÑ\80 Ñ\84айл `main.py` Ñ\96з Ð\92аÑ\88им **FastAPI**-заÑ\81Ñ\82оÑ\81Ñ\83нком Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83 (**path operations**).
\9fÑ\80ипÑ\83Ñ\81Ñ\82имо, Ñ\89о Ñ\82епеÑ\80 Ñ\84айл `main.py` Ñ\96з Ð²Ð°Ñ\88им Ð·Ð°Ñ\81Ñ\82оÑ\81Ñ\83нком **FastAPI** Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\96нÑ\88Ñ\96 **опеÑ\80аÑ\86Ñ\96Ñ\97 Ñ\88лÑ\8fÑ\85Ñ\83**.
 
 Він має `GET`-операцію, яка може повертати помилку.
 
 Він має `POST`-операцію, яка може повертати кілька помилок.
 
-Обидві операції шляху вимагають заголовок `X-Token`.
-
-//// tab | Python 3.10+
-
-```Python
-{!> ../../docs_src/app_testing/app_b_an_py310/main.py!}
-```
-
-////
-
-//// tab | Python 3.9+
-
-```Python
-{!> ../../docs_src/app_testing/app_b_an_py39/main.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-```Python
-{!> ../../docs_src/app_testing/app_b_an/main.py!}
-```
-
-////
-
-//// tab | Python 3.10+ non-Annotated
+Обидві *операції шляху* вимагають заголовок `X-Token`.
 
-/// tip | Порада
-
-Бажано використовувати версію з `Annotated`, якщо це можливо
-
-///
-
-```Python
-{!> ../../docs_src/app_testing/app_b_py310/main.py!}
-```
-
-////
-
-//// tab | Python 3.8+ non-Annotated
+{* ../../docs_src/app_testing/app_b_an_py310/main.py *}
 
-/// tip | Порада
-
-Бажано використовувати версію з `Annotated`, якщо це можливо
-
-///
+### Розширений тестовий файл { #extended-testing-file }
 
-```Python
-{!> ../../docs_src/app_testing/app_b/main.py!}
-```
-
-////
+Потім ви можете оновити `test_main.py`, додавши розширені тести:
 
-### Розширений тестовий файл
+{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
 
-Потім Ви можете оновити `test_main.py`, додавши розширені тести:
 
-{* ../../docs_src/app_testing/app_b/test_main.py *}
+Коли вам потрібно передати клієнту інформацію в запиті, але ви не знаєте, як це зробити, ви можете пошукати (Google), як це зробити в `httpx`, або навіть як це зробити з `requests`, оскільки дизайн HTTPX базується на дизайні Requests.
 
-Коли Вам потрібно передати клієнту інформацію в запиті, але Ви не знаєте, як це зробити, Ви можете пошукати (наприклад, у Google) спосіб реалізації в `httpx`, або навіть у `requests`, оскільки HTTPX розроблений на основі дизайну Requests.
-
-Далі Ви просто повторюєте ці ж дії у ваших тестах.
+Далі ви просто повторюєте ці ж дії у ваших тестах.
 
 Наприклад:
 
@@ -195,15 +147,16 @@ $ pip install httpx
 /// info | Інформація
 
 Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі.
-Якщо у Вас є Pydantic-модель у тесті, і Ви хочете передати її дані в додаток під час тестування, Ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}.
+
+Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}.
 
 ///
 
-## Запуск тестів
+## Запуск { #run-it }
 
 Після цього вам потрібно встановити `pytest`.
 
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð\92и Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е]{.internal-link target=_blank}, активували його і встановили необхідні пакети, наприклад:
\9fеÑ\80еконайÑ\82еÑ\81Ñ\8f, Ñ\89о Ð²Ð¸ Ñ\81Ñ\82воÑ\80или [вÑ\96Ñ\80Ñ\82Ñ\83алÑ\8cне Ñ\81еÑ\80едовиÑ\89е](../virtual-environments.md){.internal-link target=_blank}, активували його і встановили необхідні пакети, наприклад:
 
 <div class="termy">
 
@@ -215,7 +168,7 @@ $ pip install pytest
 
 </div>
 
-`pytest` автоматично знайде файли з тестами, виконає їх і надасть вам результати.
+Він автоматично знайде файли та тести, виконає їх і повідомить вам результати.
 
 Запустіть тести за допомогою:
 
index 84cf01c72439c50983af6221788f68e272437a26..a9abce56b510b4b48e5e5d31e3238631c1a17ae9 100644 (file)
@@ -25,6 +25,7 @@ SUPPORTED_LANGS = {
     "es",
     "pt",
     "ru",
+    "uk",
 }