* За потреби покращіть вашу мовно-специфічну підсказку, загальну підсказку або англійський документ.
* За потреби покращіть вашу мовно-специфічну підсказку, загальну підсказку або англійський документ.
* Потім вручну виправте решту проблем у перекладі, щоб він був якісним.
* Потім вручну виправте решту проблем у перекладі, щоб він був якісним.
* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що <ahref="https://doublespeak.chat/#/handbook#deterministic-output"class="external-link"target="_blank">LLM-и не є детерміністичними алгоритмами</a>).
* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що [LLM-и не є детерміністичними алгоритмами](https://doublespeak.chat/#/handbook#deterministic-output)).
Тести:
Тести:
@ -95,7 +95,7 @@ $ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid
...і ще один приклад коду консолі...
...і ще один приклад коду консолі...
```console
```console
// Створіть каталог "code"
// Створіть каталог "Code"
$ mkdir code
$ mkdir code
// Перейдіть до цього каталогу
// Перейдіть до цього каталогу
$ cd code
$ cd code
@ -125,31 +125,31 @@ works(foo="bar") # Це працює 🎉
//// tab | Тест
//// tab | Тест
/// info | Інформація
/// info | Інформація
Some text
Деякий текст
///
///
/// note | Примітка
/// note | Примітка
Some text
Деякий текст
///
///
/// note | Технічні деталі
/// note | Технічні деталі
Some text
Деякий текст
///
///
/// check | Перевірте
/// check | Перевірте
Some text
Деякий текст
///
///
/// tip | Порада
/// tip | Порада
Some text
Деякий текст
///
///
/// warning | Попередження
/// warning | Попередження
Some text
Деякий текст
///
///
/// danger | Обережно
/// danger | Обережно
Some text
Деякий текст
///
///
////
////
@ -169,15 +169,15 @@ Some text
Текст посилання має бути перекладений, адреса посилання має залишитися незмінною:
Текст посилання має бути перекладений, адреса посилання має залишитися незмінною:
Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram.
Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram.
@ -22,7 +22,7 @@
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbrtitle="Internet of Things - Інтернет речей">IoT</abbr> пристрої), які спілкуються з ним.
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbrtitle="Internet of Things - Інтернет речей">IoT</abbr> пристрої), які спілкуються з ним.
Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API.
Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API.
@ -42,7 +42,7 @@ Django REST Framework створив Том Крісті. Той самий тв
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
@ -135,9 +135,9 @@ def read_url():
Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними.
Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними.
Однією з головних функцій, необхідних для систем API, є "<dfntitle="також відома як: marshalling, перетворення">серіалізація</dfn>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
Однією з головних функцій, необхідних для систем API, є «<dfntitle="також відома як: marshalling, перетворення">серіалізація</dfn>», яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних.
Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних.
@ -153,7 +153,7 @@ Marshmallow створено для забезпечення цих функці
Це плагін Flask, який об’єднує Webargs, Marshmallow і APISpec.
Це плагін Flask, який об’єднує Webargs, Marshmallow і APISpec.
@ -219,11 +219,11 @@ APISpec був створений тими ж розробниками Marshmall
Її використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі:
Її використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі:
Це був один із перших надзвичайно швидких фреймворків Python на основі `asyncio`. Він був дуже схожий на Flask.
Це був один із перших надзвичайно швидких фреймворків Python на основі `asyncio`. Він був дуже схожий на Flask.
/// note | Технічні деталі
/// note | Технічні деталі
Він використовував <ahref="https://github.com/MagicStack/uvloop"class="external-link"target="_blank">`uvloop`</a> замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким.
Він використовував [`uvloop`](https://github.com/MagicStack/uvloop) замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким.
Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах.
Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах.
@ -279,7 +279,7 @@ Flask-apispec був створений тими ж розробниками Mar
Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме.
Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме.
@ -337,7 +337,7 @@ Hug був одним із перших фреймворків, який реа
/// info | Інформація
/// info | Інформація
Hug створив Тімоті Крослі, той самий творець <ahref="https://github.com/timothycrosley/isort"class="external-link"target="_blank">`isort`</a>, чудовий інструмент для автоматичного сортування імпорту у файлах Python.
Hug створив Тімоті Крослі, той самий творець [`isort`](https://github.com/timothycrosley/isort), чудовий інструмент для автоматичного сортування імпорту у файлах Python.
Starlette — це легкий фреймворк/набір інструментів <dfntitle="Новий стандарт для створення асинхронних вебзастосунків на Python">ASGI</dfn>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
Starlette — це легкий фреймворк/набір інструментів <dfntitle="Новий стандарт для створення асинхронних вебзастосунків на Python">ASGI</dfn>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
@ -462,7 +462,7 @@ ASGI — це новий «стандарт», який розробляєтьс
Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер.
Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер.
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}.
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md).
///
///
## Орієнтири та швидкість { #benchmarks-and-speed }
## Орієнтири та швидкість { #benchmarks-and-speed }
Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}.
Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md).
Прекрасні ілюстрації від <ahref="https://www.instagram.com/ketrinadrawsalot"class="external-link"target="_blank">Ketrina Thompson</a>. 🎨
Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
///
@ -207,7 +207,7 @@ def results():
/// info | Інформація
/// info | Інформація
Прекрасні ілюстрації від <ahref="https://www.instagram.com/ketrinadrawsalot"class="external-link"target="_blank">Ketrina Thompson</a>. 🎨
Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
///
@ -215,7 +215,7 @@ def results():
У цьому сценарії паралельних бургерів ви - комп’ютер/програма 🤖 з двома процесорами (ви і ваша симпатія), які обидва чекають 🕙 і приділяють увагу ⏯ «очікуванню біля прилавка» 🕙 тривалий час.
У цьому сценарії паралельних бургерів ви - комп’ютер/програма 🤖 з двома процесорами (ви і ваша симпатія), які обидва чекають 🕙 і приділяють увагу ⏯ «очікуванню біля прилавка» 🕙 тривалий час.
У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладі з рівночасними бургерами могло бути лише 2 (один касир і один кухар).
У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладу з рівночасними бургерами могло бути лише 2 (один касир і один кухар).
Та все одно фінальний досвід не найкращий. 😞
Та все одно фінальний досвід не найкращий. 😞
@ -251,7 +251,7 @@ def results():
І такий самий рівень продуктивності ви отримуєте з **FastAPI**.
І такий самий рівень продуктивності ви отримуєте з **FastAPI**.
А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C <ahref="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1"class="external-link"target="_blank">(усе завдяки Starlette)</a>.
А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C [(усе завдяки Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
### Чи краща рівночасність за паралелізм? { #is-concurrency-better-than-parallelism }
### Чи краща рівночасність за паралелізм? { #is-concurrency-better-than-parallelism }
@ -298,7 +298,7 @@ def results():
Це, плюс простий факт, що Python є основною мовою для **Data Science**, машинного навчання і особливо глибокого навчання, робить FastAPI дуже вдалим вибором для веб API та застосунків Data Science / машинного навчання (серед багатьох інших).
Це, плюс простий факт, що Python є основною мовою для **Data Science**, машинного навчання і особливо глибокого навчання, робить FastAPI дуже вдалим вибором для веб API та застосунків Data Science / машинного навчання (серед багатьох інших).
Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md){.internal-link target=_blank}.
Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md).
## `async` і `await` { #async-and-await }
## `async` і `await` { #async-and-await }
@ -363,13 +363,13 @@ async def read_burgers():
### Пишемо свій власний async-код { #write-your-own-async-code }
### Пишемо свій власний async-код { #write-your-own-async-code }
Starlette (і **FastAPI**) базуються на <ahref="https://anyio.readthedocs.io/en/stable/"class="external-link"target="_blank">AnyIO</a>, що робить їх сумісними як зі стандартною бібліотекою Python <ahref="https://docs.python.org/3/library/asyncio-task.html"class="external-link"target="_blank">asyncio</a>, так і з <ahref="https://trio.readthedocs.io/en/stable/"class="external-link"target="_blank">Trio</a>.
Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthedocs.io/en/stable/), що робить їх сумісними як зі стандартною бібліотекою Python [asyncio](https://docs.python.org/3/library/asyncio-task.html), так і з [Trio](https://trio.readthedocs.io/en/stable/).
Зокрема, ви можете безпосередньо використовувати <ahref="https://anyio.readthedocs.io/en/stable/"class="external-link"target="_blank">AnyIO</a> для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді.
Зокрема, ви можете безпосередньо використовувати [AnyIO](https://anyio.readthedocs.io/en/stable/) для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді.
І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з <ahref="https://anyio.readthedocs.io/en/stable/"class="external-link"target="_blank">AnyIO</a>, щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*).
І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з [AnyIO](https://anyio.readthedocs.io/en/stable/), щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*).
Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: <ahref="https://asyncer.tiangolo.com/"class="external-link"target="_blank">Asyncer</a>. Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом.
Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: [Asyncer](https://asyncer.tiangolo.com/). Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом.
### Інші форми асинхронного коду { #other-forms-of-asynchronous-code }
### Інші форми асинхронного коду { #other-forms-of-asynchronous-code }
@ -381,7 +381,7 @@ Starlette (і **FastAPI**) базуються на <a href="https://anyio.readth
До цього робота з асинхронним кодом була значно складнішою.
До цього робота з асинхронним кодом була значно складнішою.
У попередніх версіях Python ви могли використовувати потоки (threads) або <ahref="https://www.gevent.org/"class="external-link"target="_blank">Gevent</a>. Але код набагато складніший для розуміння, налагодження і мислення про нього.
У попередніх версіях Python ви могли використовувати потоки (threads) або [Gevent](https://www.gevent.org/). Але код набагато складніший для розуміння, налагодження і мислення про нього.
У попередніх версіях NodeJS/Browser JavaScript ви б використовували «callbacks», що призводить до «callback hell».
У попередніх версіях NodeJS/Browser JavaScript ви б використовували «callbacks», що призводить до «callback hell».
@ -419,15 +419,15 @@ Starlette (і **FastAPI**) базуються на <a href="https://anyio.readth
Якщо ви прийшли з іншого async-фреймворку, який не працює так, як описано вище, і звикли визначати тривіальні, лише обчислювальні функції операції шляху зі звичайним `def` заради крихітного виграшу у продуктивності (близько 100 наносекунд), зверніть увагу, що у **FastAPI** ефект буде протилежним. У таких випадках краще використовувати `async def`, якщо тільки ваші функції операції шляху не використовують код, що виконує блокуюче <abbrtitle="Input/Output - Ввід/Вивід: читання або запис на диск, мережеві комунікації.">I/O</abbr>.
Якщо ви прийшли з іншого async-фреймворку, який не працює так, як описано вище, і звикли визначати тривіальні, лише обчислювальні функції операції шляху зі звичайним `def` заради крихітного виграшу у продуктивності (близько 100 наносекунд), зверніть увагу, що у **FastAPI** ефект буде протилежним. У таких випадках краще використовувати `async def`, якщо тільки ваші функції операції шляху не використовують код, що виконує блокуюче <abbrtitle="Input/Output - Ввід/Вивід: читання або запис на диск, мережеві комунікації.">I/O</abbr>.
Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance){.internal-link target=_blank} (або принаймні порівнянним) за ваш попередній фреймворк.
Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance) (або принаймні порівнянним) за ваш попередній фреймворк.
### Залежності { #dependencies }
### Залежності { #dependencies }
Те саме стосується і [залежностей](tutorial/dependencies/index.md){.internal-link target=_blank}. Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків.
Те саме стосується і [залежностей](tutorial/dependencies/index.md). Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків.
### Підзалежності { #sub-dependencies }
### Підзалежності { #sub-dependencies }
Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані».
Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md), які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані».
### Інші допоміжні функції { #other-utility-functions }
### Інші допоміжні функції { #other-utility-functions }
Незалежні бенчмарки TechEmpower показують, що застосунки FastAPI, запущені під керуванням Uvicorn, є <ahref="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 внутрішньо).
Незалежні бенчмарки TechEmpower показують, що застосунки **FastAPI**, запущені під керуванням Uvicorn, є [одним із найшвидших доступних фреймворків Python](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише самим Starlette і Uvicorn (використовуються FastAPI внутрішньо).
Але переглядаючи бенчмарки та порівняння, майте на увазі таке.
Але переглядаючи бенчмарки та порівняння, майте на увазі таке.
* FastAPI: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо.
* **FastAPI**: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо.
* Uvicorn:
* **Uvicorn**:
* Матиме найвищу продуктивність, адже майже не містить додаткового коду окрім власне сервера.
* Матиме найвищу продуктивність, адже майже не містить додаткового коду окрім власне сервера.
* Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або FastAPI). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки.
* Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або **FastAPI**). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки.
* Якщо ви порівнюєте Uvicorn, порівнюйте його з Daphne, Hypercorn, uWSGI тощо. Сервери застосунків.
* Якщо ви порівнюєте Uvicorn, порівнюйте його з Daphne, Hypercorn, uWSGI тощо. Сервери застосунків.
* Starlette:
* **Starlette**:
* Матиме наступну за швидкістю продуктивність після Uvicorn. Насправді Starlette використовує Uvicorn для запуску. Тож вона може бути «повільнішою» за Uvicorn лише через необхідність виконувати більше коду.
* Матиме наступну за швидкістю продуктивність після Uvicorn. Насправді Starlette використовує Uvicorn для запуску. Тож вона може бути «повільнішою» за Uvicorn лише через необхідність виконувати більше коду.
* Але надає інструменти для створення простих веб-застосунків із маршрутизацією на основі шляхів тощо.
* Але надає інструменти для створення простих веб-застосунків із маршрутизацією на основі шляхів тощо.
* Якщо ви порівнюєте Starlette, порівнюйте її з Sanic, Flask, Django тощо. Веб-фреймворки (або мікрофреймворки).
* Якщо ви порівнюєте Starlette, порівнюйте її з Sanic, Flask, Django тощо. Веб-фреймворки (або мікрофреймворки).
* FastAPI:
* **FastAPI**:
* Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, FastAPI використовує Starlette, тож не може бути швидшою за неї.
* Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, **FastAPI** використовує Starlette, тож не може бути швидшою за неї.
* FastAPI надає більше можливостей поверх Starlette. Можливості, які майже завжди потрібні під час створення API, як-от валідація та серіалізація даних. І, використовуючи його, ви безкоштовно отримуєте автоматичну документацію (автоматична документація навіть не додає накладних витрат під час роботи застосунку - вона генерується під час запуску).
* FastAPI надає більше можливостей поверх Starlette. Можливості, які майже завжди потрібні під час створення API, як-от валідація та серіалізація даних. І, використовуючи його, ви безкоштовно отримуєте автоматичну документацію (автоматична документація навіть не додає накладних витрат під час роботи застосунку - вона генерується під час запуску).
* Якби ви не використовували FastAPI і застосували Starlette безпосередньо (або інший інструмент, наприклад Sanic, Flask, Responder тощо), вам довелося б самостійно реалізувати всю валідацію та серіалізацію даних. Тож ваш кінцевий застосунок усе одно мав би ті самі накладні витрати, ніби він був створений із використанням FastAPI. І в багатьох випадках саме ця валідація та серіалізація даних становить найбільший обсяг коду в застосунках.
* Якби ви не використовували FastAPI і застосували Starlette безпосередньо (або інший інструмент, наприклад Sanic, Flask, Responder тощо), вам довелося б самостійно реалізувати всю валідацію та серіалізацію даних. Тож ваш кінцевий застосунок усе одно мав би ті самі накладні витрати, ніби він був створений із використанням FastAPI. І в багатьох випадках саме ця валідація та серіалізація даних становить найбільший обсяг коду в застосунках.
* Отже, використовуючи FastAPI, ви заощаджуєте час розробки, зменшуєте кількість помилок і рядків коду та, ймовірно, отримуєте таку саму (або кращу) продуктивність, як і без нього (адже інакше вам довелося б реалізувати все це у власному коді).
* Отже, використовуючи FastAPI, ви заощаджуєте час розробки, зменшуєте кількість помилок і рядків коду та, ймовірно, отримуєте таку саму (або кращу) продуктивність, як і без нього (адже інакше вам довелося б реалізувати все це у власному коді).
@ -65,7 +65,7 @@ print(f"Hello {name} from Python")
/// tip | Порада
/// tip | Порада
Другий аргумент до <ahref="https://docs.python.org/3.8/library/os.html#os.getenv"class="external-link"target="_blank">`os.getenv()`</a> - це значення за замовчуванням, яке буде повернено.
Другий аргумент до [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - це значення за замовчуванням, яке буде повернено.
Якщо його не вказано, за замовчуванням це `None`. Тут ми надаємо `"World"` як значення за замовчуванням.
Якщо його не вказано, за замовчуванням це `None`. Тут ми надаємо `"World"` як значення за замовчуванням.
@ -153,7 +153,7 @@ Hello World from Python
/// tip | Порада
/// tip | Порада
Докладніше про це можна прочитати у <ahref="https://12factor.net/config"class="external-link"target="_blank">The Twelve-Factor App: Config</a>.
Ви можете прочитати більше у [The Twelve-Factor App: Config](https://12factor.net/config).
///
///
@ -163,7 +163,7 @@ Hello World from Python
Це означає, що будь-яке значення, прочитане в Python зі змінної оточення, буде `str`, а будь-яке перетворення до іншого типу або будь-яка перевірка має виконуватися в коді.
Це означає, що будь-яке значення, прочитане в Python зі змінної оточення, буде `str`, а будь-яке перетворення до іншого типу або будь-яка перевірка має виконуватися в коді.
Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md){.internal-link target=_blank}.
Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md).
Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md){.internal-link target=_blank}.
Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md).
## Висновок { #conclusion }
## Висновок { #conclusion }
Тепер ви маєте базове розуміння того, що таке змінні оточення і як їх використовувати в Python.
Тепер ви маєте базове розуміння того, що таке змінні оточення і як їх використовувати в Python.
Також можна прочитати більше у <ahref="https://en.wikipedia.org/wiki/Environment_variable"class="external-link"target="_blank">Вікіпедії про змінну оточення</a>.
Також можна прочитати більше у [Вікіпедії про змінну оточення](https://en.wikipedia.org/wiki/Environment_variable).
У багатьох випадках не одразу очевидно, як змінні оточення будуть корисними та застосовними. Але вони постійно з’являються в різних сценаріях під час розробки, тож варто про них знати.
У багатьох випадках не одразу очевидно, як змінні оточення будуть корисними та застосовними. Але вони постійно з’являються в різних сценаріях під час розробки, тож варто про них знати.
**FastAPI CLI** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо.
**FastAPI <abbrtitle="command line interface - інтерфейс командного рядка">CLI</abbr>** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо.
Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він включає пакет під назвою `fastapi-cli`, цей пакет надає команду `fastapi` у терміналі.
Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він постачається з програмою командного рядка, яку можна запускати в терміналі.
Щоб запустити ваш застосунок FastAPI для розробки, ви можете використати команду `fastapi dev`:
Щоб запустити ваш застосунок FastAPI для розробки, ви можете використати команду `fastapi dev`:
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@ -46,13 +46,66 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
</div>
</div>
Програма командного рядка під назвою `fastapi` — це **FastAPI CLI**.
/// tip | Порада
Для продакшну ви б використовували `fastapi run` замість `fastapi dev`. 🚀
///
Внутрішньо **FastAPI CLI** використовує [Uvicorn](https://www.uvicorn.dev), високопродуктивний, готовий до продакшну ASGI сервер. 😎
CLI `fastapi` спробує автоматично визначити застосунок FastAPI для запуску, припускаючи, що це об'єкт з назвою `app` у файлі `main.py` (або кілька інших варіантів).
Але ви можете явно налаштувати застосунок, який слід використовувати.
## Налаштуйте `entrypoint` застосунку в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
Ви можете налаштувати розташування вашого застосунку у файлі `pyproject.toml`, наприклад:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
Цей `entrypoint` підкаже команді `fastapi`, що слід імпортувати застосунок так:
```python
from main import app
```
FastAPI CLI бере шлях до вашої Python-програми (наприклад, `main.py`) і автоматично виявляє екземпляр `FastAPI` (зазвичай з назвою `app`), визначає правильний процес імпорту, а потім обслуговує його.
Якщо ваш код має таку структуру:
```
.
├── backend
│ ├── main.py
│ ├── __init__.py
```
Тоді ви встановили б `entrypoint` як:
```toml
[tool.fastapi]
entrypoint = "backend.main:app"
```
що еквівалентно:
```python
from backend.main import app
```
### `fastapi dev` зі шляхом { #fastapi-dev-with-path }
Ви також можете передати шлях до файлу команді `fastapi dev`, і вона здогадається, який об'єкт застосунку FastAPI використовувати:
```console
$ fastapi dev main.py
```
Натомість, для продакшн ви використали б `fastapi run`. 🚀
Але вам доведеться щоразу пам'ятати, щоб передавати правильний шлях під час виклику команди `fastapi`.
Внутрішньо **FastAPI CLI** використовує <ahref="https://www.uvicorn.dev"class="external-link"target="_blank">Uvicorn</a>, високопродуктивний, production-ready, ASGI сервер. 😎
Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](editor-support.md){.internal-link target=_blank} або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`.
### На основі відкритих стандартів { #based-on-open-standards }
### На основі відкритих стандартів { #based-on-open-standards }
* <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank"><strong>OpenAPI</strong></a> для створення API, включаючи оголошення <dfntitle="також відомі як: кінцеві точки, маршрути">шляхів</dfn>,<dfntitle="також відомі як методи HTTP, як-от POST, GET, PUT, DELETE">операцій</dfn>, параметрів, тіл запитів, безпеки тощо.
* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) для створення API, включаючи оголошення <dfntitle="також відомі як: кінцеві точки, маршрути">шляхів</dfn><dfntitle="також відомі як методи HTTP, як-от POST, GET, PUT, DELETE">операцій</dfn>, параметрів, тіл запитів, безпеки тощо.
* Автоматична документація моделей даних за допомогою <ahref="https://json-schema.org/"class="external-link"target="_blank"><strong>JSON Schema</strong></a> (оскільки OpenAPI базується саме на JSON Schema).
* Автоматична документація моделей даних за допомогою [**JSON Schema**](https://json-schema.org/) (оскільки OpenAPI базується саме на JSON Schema).
* Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури.
* Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури.
* Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами.
* Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами.
@ -15,11 +15,11 @@
Інтерактивна документація API та вебінтерфейси для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, 2 з яких включені за замовчуванням.
Інтерактивна документація API та вебінтерфейси для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, 2 з яких включені за замовчуванням.
* <ahref="https://github.com/swagger-api/swagger-ui"class="external-link"target="_blank"><strong>Swagger UI</strong></a> — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера.
* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера.
* Альтернативна документація API за допомогою <ahref="https://github.com/Rebilly/ReDoc"class="external-link"target="_blank"><strong>ReDoc</strong></a>.
* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Rebilly/ReDoc).
Усе базується на стандартних оголошеннях **типів Python** (завдяки Pydantic). Жодного нового синтаксису для вивчення. Лише стандартний сучасний Python.
Усе базується на стандартних оголошеннях **типів Python** (завдяки Pydantic). Жодного нового синтаксису для вивчення. Лише стандартний сучасний Python.
Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md){.internal-link target=_blank}.
Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md).
Ви пишете стандартний Python з типами:
Ви пишете стандартний Python з типами:
@ -71,11 +71,11 @@ my_second_user: User = User(**second_user_data)
///
///
### Підтримка редакторів (IDE) { #editor-support }
### Підтримка редакторів { #editor-support }
Увесь фреймворк спроєктовано так, щоб ним було легко та інтуїтивно користуватися; усі рішення тестувалися у кількох редакторах ще до початку розробки, щоб забезпечити найкращий досвід розробки.
Увесь фреймворк спроєктовано так, щоб ним було легко та інтуїтивно користуватися; усі рішення тестувалися у кількох редакторах ще до початку розробки, щоб забезпечити найкращий досвід розробки.
З опитувань розробників Python зрозуміло <ahref="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features"class="external-link"target="_blank">що однією з найуживаніших функцій є «автодоповнення»</a>.
З опитувань розробників Python зрозуміло [що однією з найуживаніших функцій є «автодоповнення»](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features).
Увесь фреймворк **FastAPI** побудований так, щоб це забезпечити. Автодоповнення працює всюди.
Увесь фреймворк **FastAPI** побудований так, щоб це забезпечити. Автодоповнення працює всюди.
@ -83,11 +83,11 @@ my_second_user: User = User(**second_user_data)
Ось як ваш редактор може вам допомогти:
Ось як ваш редактор може вам допомогти:
* у <ahref="https://code.visualstudio.com/"class="external-link"target="_blank">Visual Studio Code</a>:
* у [Visual Studio Code](https://code.visualstudio.com/):
@ -124,7 +124,7 @@ FastAPI має розумні **налаштування за замовчува
Підтримуються всі схеми безпеки, визначені в OpenAPI, включно з:
Підтримуються всі схеми безпеки, визначені в OpenAPI, включно з:
* HTTP Basic.
* HTTP Basic.
* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md).
* Ключі API в:
* Ключі API в:
* Заголовках.
* Заголовках.
* Параметрах запиту.
* Параметрах запиту.
@ -141,7 +141,7 @@ FastAPI містить надзвичайно просту у використа
* Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**.
* Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**.
* Усе **автоматично обробляється** фреймворком.
* Усе **автоматично обробляється** фреймворком.
* Усі залежності можуть вимагати дані із запитів і **розширювати обмеження операції шляху** та автоматичну документацію.
* Усі залежності можуть вимагати дані із запитів і **розширювати обмеження операції шляху** та автоматичну документацію.
* **Автоматична валідація** навіть для параметрів *операції шляху*, визначених у залежностях.
* **Автоматична валідація** навіть для *операції шляху*, визначених у залежностях.
* Підтримка складних систем автентифікації користувачів, **підключень до баз даних** тощо.
* Підтримка складних систем автентифікації користувачів, **підключень до баз даних** тощо.
* **Жодних компромісів** із базами даних, фронтендами тощо. Але проста інтеграція з усіма ними.
* **Жодних компромісів** із базами даних, фронтендами тощо. Але проста інтеграція з усіма ними.
@ -159,13 +159,13 @@ FastAPI містить надзвичайно просту у використа
## Можливості Starlette { #starlette-features }
## Можливості Starlette { #starlette-features }
**FastAPI** повністю сумісний із (та побудований на основі) <ahref="https://www.starlette.dev/"class="external-link"target="_blank"><strong>Starlette</strong></a>. Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме.
**FastAPI** повністю сумісний із (та побудований на основі) [**Starlette**](https://www.starlette.dev/). Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме.
`FastAPI` фактично є підкласом `Starlette`. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само.
`FastAPI` фактично є підкласом `Starlette`. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само.
З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це просто Starlette на стероїдах):
З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це просто Starlette на стероїдах):
* Разюча продуктивність. Це <ahref="https://github.com/encode/starlette#performance"class="external-link"target="_blank">один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**</a>.
* Разюча продуктивність. Це [один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**](https://github.com/encode/starlette#performance).
* Підтримка **WebSocket**.
* Підтримка **WebSocket**.
* Фонові задачі у процесі.
* Фонові задачі у процесі.
* Події запуску та завершення роботи.
* Події запуску та завершення роботи.
@ -177,7 +177,7 @@ FastAPI містить надзвичайно просту у використа
## Можливості Pydantic { #pydantic-features }
## Можливості Pydantic { #pydantic-features }
**FastAPI** повністю сумісний із (та побудований на основі) <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank"><strong>Pydantic</strong></a>. Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме.
**FastAPI** повністю сумісний із (та побудований на основі) [**Pydantic**](https://docs.pydantic.dev/). Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме.
Включно із зовнішніми бібліотеками, які також базуються на Pydantic, як-от <abbrtitle="Object-Relational Mapper - Об'єктно-реляційний відображувач">ORM</abbr>-и, <abbrtitle="Object-Document Mapper - Об'єктно-документний відображувач">ODM</abbr>-и для баз даних.
Включно із зовнішніми бібліотеками, які також базуються на Pydantic, як-от <abbrtitle="Object-Relational Mapper - Об'єктно-реляційний відображувач">ORM</abbr>-и, <abbrtitle="Object-Document Mapper - Об'єктно-документний відображувач">ODM</abbr>-и для баз даних.
## Підпишіться на розсилку { #subscribe-to-the-newsletter }
## Підпишіться на розсилку { #subscribe-to-the-newsletter }
Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md){.internal-link target=_blank}, щоб бути в курсі:
Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md), щоб бути в курсі:
* Новин про FastAPI та друзів 🚀
* Новин про FastAPI та друзів 🚀
* Посібників 📝
* Посібників 📝
@ -22,17 +22,17 @@
## Стежте за FastAPI в X (Twitter) { #follow-fastapi-on-x-twitter }
## Стежте за FastAPI в X (Twitter) { #follow-fastapi-on-x-twitter }
<ahref="https://x.com/fastapi"class="external-link"target="_blank">Стежте за @fastapi в **X (Twitter)**</a>, щоб отримувати найсвіжіші новини про **FastAPI**. 🐦
[Стежте за @fastapi в **X (Twitter)**](https://x.com/fastapi), щоб отримувати найсвіжіші новини про **FastAPI**. 🐦
## Додайте зірочку **FastAPI** на GitHub { #star-fastapi-in-github }
## Додайте зірочку **FastAPI** на GitHub { #star-fastapi-in-github }
Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): <ahref="https://github.com/fastapi/fastapi"class="external-link"target="_blank">https://github.com/fastapi/fastapi</a>. ⭐️
Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️
Додавши зірочку, іншим користувачам буде легше його знайти і побачити, що він уже був корисним для інших.
Додавши зірочку, іншим користувачам буде легше його знайти і побачити, що він уже був корисним для інших.
## Стежте за випусками в репозиторії GitHub { #watch-the-github-repository-for-releases }
## Стежте за випусками в репозиторії GitHub { #watch-the-github-repository-for-releases }
Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): <ahref="https://github.com/fastapi/fastapi"class="external-link"target="_blank">https://github.com/fastapi/fastapi</a>. 👀
Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
Там ви можете вибрати «Releases only».
Там ви можете вибрати «Releases only».
@ -40,45 +40,45 @@
## Зв'яжіться з автором { #connect-with-the-author }
## Зв'яжіться з автором { #connect-with-the-author }
Ви можете зв'язатися зі <ahref="https://tiangolo.com"class="external-link"target="_blank">мною (Sebastián Ramírez / `tiangolo`)</a>, автором.
Ви можете зв'язатися зі [мною (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), автором.
Ви можете:
Ви можете:
* <ahref="https://github.com/tiangolo"class="external-link"target="_blank">Стежити за мною на **GitHub**</a>.
* [Стежити за мною на **GitHub**](https://github.com/tiangolo).
* Подивитися інші Open Source-проєкти, які я створив і які можуть вам допомогти.
* Подивитися інші Open Source-проєкти, які я створив і які можуть вам допомогти.
* Стежити, щоб бачити, коли я створюю новий Open Source-проєкт.
* Стежити, щоб бачити, коли я створюю новий Open Source-проєкт.
* <ahref="https://x.com/tiangolo"class="external-link"target="_blank">Стежити за мною в **X (Twitter)**</a> або <ahref="https://fosstodon.org/@tiangolo"class="external-link"target="_blank">Mastodon</a>.
* [Стежити за мною в **X (Twitter)**](https://x.com/tiangolo) або [Mastodon](https://fosstodon.org/@tiangolo).
* Розкажіть мені, як ви використовуєте FastAPI (мені дуже приємно це чути).
* Розкажіть мені, як ви використовуєте FastAPI (мені дуже приємно це чути).
* Дізнаватися, коли я роблю оголошення або випускаю нові інструменти.
* Дізнаватися, коли я роблю оголошення або випускаю нові інструменти.
* Також ви можете <ahref="https://x.com/fastapi"class="external-link"target="_blank">стежити за @fastapi в X (Twitter)</a> (окремий акаунт).
* Також ви можете [стежити за @fastapi в X (Twitter)](https://x.com/fastapi) (окремий акаунт).
* <ahref="https://www.linkedin.com/in/tiangolo/"class="external-link"target="_blank">Стежити за мною в **LinkedIn**</a>.
* [Стежити за мною в **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
* Дізнаватися, коли я роблю оголошення або випускаю нові інструменти (хоча X (Twitter) я використовую частіше 🤷♂).
* Дізнаватися, коли я роблю оголошення або випускаю нові інструменти (хоча X (Twitter) я використовую частіше 🤷♂).
* Читати, що я пишу (або стежити за мною) на <ahref="https://dev.to/tiangolo"class="external-link"target="_blank">**Dev.to**</a> або <ahref="https://medium.com/@tiangolo"class="external-link"target="_blank">**Medium**</a>.
* Читати, що я пишу (або стежити за мною) на [**Dev.to**](https://dev.to/tiangolo) або [**Medium**](https://medium.com/@tiangolo).
* Читати інші ідеї, статті та про інструменти, які я створив.
* Читати інші ідеї, статті та про інструменти, які я створив.
* Стежити, щоб читати нове, коли я щось публікую.
* Стежити, щоб читати нове, коли я щось публікую.
## Твітніть про **FastAPI** { #tweet-about-fastapi }
## Твітніть про **FastAPI** { #tweet-about-fastapi }
<ahref="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi"class="external-link"target="_blank">Твітніть про **FastAPI**</a> і дайте мені та іншим знати, чому він вам подобається. 🎉
[Твітніть про **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) і дайте мені та іншим знати, чому він вам подобається. 🎉
Мені дуже подобається дізнаватися, як використовують **FastAPI**, що вам у ньому сподобалося, у якому проєкті/компанії ви його застосовуєте тощо.
Мені дуже подобається дізнаватися, як використовують **FastAPI**, що вам у ньому сподобалося, у якому проєкті/компанії ви його застосовуєте тощо.
## Голосуйте за FastAPI { #vote-for-fastapi }
## Голосуйте за FastAPI { #vote-for-fastapi }
* <ahref="https://www.slant.co/options/34241/~fastapi-review"class="external-link"target="_blank">Проголосуйте за **FastAPI** на Slant</a>.
* [Проголосуйте за **FastAPI** на Slant](https://www.slant.co/options/34241/~fastapi-review).
* <ahref="https://alternativeto.net/software/fastapi/about/"class="external-link"target="_blank">Проголосуйте за **FastAPI** на AlternativeTo</a>.
* [Проголосуйте за **FastAPI** на AlternativeTo](https://alternativeto.net/software/fastapi/about/).
* <ahref="https://stackshare.io/pypi-fastapi"class="external-link"target="_blank">Повідомте, що ви використовуєте **FastAPI**, на StackShare</a>.
* [Повідомте, що ви використовуєте **FastAPI**, на StackShare](https://stackshare.io/pypi-fastapi).
## Допомагайте іншим з питаннями на GitHub { #help-others-with-questions-in-github }
## Допомагайте іншим з питаннями на GitHub { #help-others-with-questions-in-github }
Ви можете спробувати допомагати іншим з їхніми питаннями у:
Ви можете спробувати допомагати іншим з їхніми питаннями у:
У багатьох випадках ви вже можете знати відповідь на ці питання. 🤓
У багатьох випадках ви вже можете знати відповідь на ці питання. 🤓
Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉
Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts). 🎉
Пам'ятайте, найважливіше: намагайтеся бути добрими. Люди приходять зі своєю фрустрацією і часто питають не найкращим чином, але постарайтеся бути якомога доброзичливішими. 🤗
Пам'ятайте, найважливіше: намагайтеся бути добрими. Люди приходять зі своєю фрустрацією і часто питають не найкращим чином, але постарайтеся бути якомога доброзичливішими. 🤗
@ -104,7 +104,7 @@
Часто вони наводять лише фрагмент коду, але цього недостатньо, щоб **відтворити проблему**.
Часто вони наводять лише фрагмент коду, але цього недостатньо, щоб **відтворити проблему**.
* Ви можете попросити надати <ahref="https://stackoverflow.com/help/minimal-reproducible-example"class="external-link"target="_blank">мінімальний, відтворюваний приклад</a>, який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання.
* Ви можете попросити надати [мінімальний, відтворюваний приклад](https://stackoverflow.com/help/minimal-reproducible-example), який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання.
* Якщо ви дуже щедрі, можете спробувати **створити такий приклад** самостійно, лише на основі опису проблеми. Просто майте на увазі, що це може зайняти багато часу, і краще спочатку попросити їх уточнити проблему.
* Якщо ви дуже щедрі, можете спробувати **створити такий приклад** самостійно, лише на основі опису проблеми. Просто майте на увазі, що це може зайняти багато часу, і краще спочатку попросити їх уточнити проблему.
@ -125,7 +125,7 @@
## Стежте за репозиторієм GitHub { #watch-the-github-repository }
## Стежте за репозиторієм GitHub { #watch-the-github-repository }
Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): <ahref="https://github.com/fastapi/fastapi"class="external-link"target="_blank">https://github.com/fastapi/fastapi</a>. 👀
Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
Якщо вибрати «Watching» замість «Releases only», ви отримуватимете сповіщення, коли хтось створює нове issue або питання. Ви також можете вказати, що хочете отримувати сповіщення лише про нові issues, або discussions, або PR тощо.
Якщо вибрати «Watching» замість «Releases only», ви отримуватимете сповіщення, коли хтось створює нове issue або питання. Ви також можете вказати, що хочете отримувати сповіщення лише про нові issues, або discussions, або PR тощо.
@ -133,7 +133,7 @@
## Ставте питання { #ask-questions }
## Ставте питання { #ask-questions }
Ви можете <ahref="https://github.com/fastapi/fastapi/discussions/new?category=questions"class="external-link"target="_blank">створити нове питання</a> у репозиторії GitHub, наприклад, щоб:
Ви можете [створити нове питання](https://github.com/fastapi/fastapi/discussions/new?category=questions) у репозиторії GitHub, наприклад, щоб:
* Поставити **питання** або запитати про **проблему**.
* Поставити **питання** або запитати про **проблему**.
* Запропонувати нову **можливість**.
* Запропонувати нову **можливість**.
@ -170,7 +170,7 @@
* Потім залиште **коментар**, що ви це зробили, так я знатиму, що ви справді перевірили.
* Потім залиште **коментар**, що ви це зробили, так я знатиму, що ви справді перевірили.
/// info | Інформація
/// info
На жаль, я не можу просто довіряти PR, які мають кілька схвалень.
На жаль, я не можу просто довіряти PR, які мають кілька схвалень.
@ -196,12 +196,12 @@
## Створіть запит на витяг { #create-a-pull-request }
## Створіть запит на витяг { #create-a-pull-request }
Ви можете [зробити внесок](contributing.md){.internal-link target=_blank} у вихідний код із запитами на витяг, наприклад:
Ви можете [зробити внесок](contributing.md) у вихідний код із запитами на витяг, наприклад:
* Щоб виправити описку, знайдену в документації.
* Щоб виправити описку, знайдену в документації.
* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, <ahref="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml"class="external-link"target="_blank">відредагувавши цей файл</a>.
* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, [відредагувавши цей файл](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml).
* Обов'язково додайте ваше посилання на початок відповідного розділу.
* Обов'язково додайте ваше посилання на початок відповідного розділу.
* Щоб допомогти [перекласти документацію](contributing.md#translations){.internal-link target=_blank} вашою мовою.
* Щоб допомогти [перекласти документацію](contributing.md#translations) вашою мовою.
* Ви також можете допомогти з переглядом перекладів, створених іншими.
* Ви також можете допомогти з переглядом перекладів, створених іншими.
* Щоб запропонувати нові розділи документації.
* Щоб запропонувати нові розділи документації.
* Щоб виправити наявну проблему/помилку.
* Щоб виправити наявну проблему/помилку.
@ -218,8 +218,8 @@
Основні завдання, які ви можете виконувати вже зараз:
Основні завдання, які ви можете виконувати вже зараз:
* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (див. розділ вище).
* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github) (див. розділ вище).
* [Переглядайте запити на витяг](#review-pull-requests){.internal-link target=_blank} (див. розділ вище).
* [Переглядайте запити на витяг](#review-pull-requests) (див. розділ вище).
Ці два завдання **найбільше споживають час**. Це основна робота з підтримки FastAPI.
Ці два завдання **найбільше споживають час**. Це основна робота з підтримки FastAPI.
@ -227,11 +227,11 @@
## Долучайтеся до чату { #join-the-chat }
## Долучайтеся до чату { #join-the-chat }
Долучайтеся до 👥 <ahref="https://discord.gg/VQjSZaeJmf"class="external-link"target="_blank">серверу чату Discord</a> 👥 і спілкуйтеся з іншими в спільноті FastAPI.
Долучайтеся до 👥 [серверу чату Discord](https://discord.gg/VQjSZaeJmf) 👥 і спілкуйтеся з іншими в спільноті FastAPI.
/// tip | Порада
/// tip
Для запитань ставте їх у <ahref="https://github.com/fastapi/fastapi/discussions/new?category=questions"class="external-link"target="_blank">GitHub Discussions</a>, там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}.
Для запитань ставте їх у [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts).
Використовуйте чат лише для інших загальних розмов.
Використовуйте чат лише для інших загальних розмов.
@ -243,13 +243,13 @@
У GitHub шаблон підкаже вам, як написати правильне питання, щоб ви легше отримали хорошу відповідь, або навіть вирішили проблему самостійно ще до запиту. І в GitHub я можу гарантувати, що завжди на все відповім, навіть якщо це займе трохи часу. Особисто я не можу робити це в чатах. 😅
У GitHub шаблон підкаже вам, як написати правильне питання, щоб ви легше отримали хорошу відповідь, або навіть вирішили проблему самостійно ще до запиту. І в GitHub я можу гарантувати, що завжди на все відповім, навіть якщо це займе трохи часу. Особисто я не можу робити це в чатах. 😅
Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, тож швидше за все ви отримаєте більше уваги саме в GitHub.
Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts), тож швидше за все ви отримаєте більше уваги саме в GitHub.
З іншого боку, у чатах є тисячі користувачів, тож дуже ймовірно, що ви майже завжди знайдете там співрозмовника. 😄
З іншого боку, у чатах є тисячі користувачів, тож дуже ймовірно, що ви майже завжди знайдете там співрозмовника. 😄
## Спонсоруйте автора { #sponsor-the-author }
## Спонсоруйте автора { #sponsor-the-author }
Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через <ahref="https://github.com/sponsors/tiangolo"class="external-link"target="_blank">GitHub sponsors</a>. Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁
Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через [GitHub sponsors](https://github.com/sponsors/tiangolo). Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁
# Історія, проєктування і майбутнє { #history-design-and-future }
# Історія, проєктування і майбутнє { #history-design-and-future }
Деякий час тому <ahref="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920"class="external-link"target="_blank">користувач **FastAPI** запитав</a>:
Деякий час тому [користувач **FastAPI** запитав](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920):
> Яка історія цього проєкту? Здається, він нізвідки за кілька тижнів став чудовим [...]
> Яка історія цього проєкту? Здається, він нізвідки за кілька тижнів став чудовим [...]
@ -14,7 +14,7 @@
Історія **FastAPI** значною мірою - це історія його попередників.
Історія **FastAPI** значною мірою - це історія його попередників.
Як сказано в розділі [Альтернативи](alternatives.md){.internal-link target=_blank}:
Як сказано в розділі [Альтернативи](alternatives.md):
<blockquotemarkdown="1">
<blockquotemarkdown="1">
@ -44,7 +44,7 @@
Я протестував кілька ідей у найпопулярніших Python-редакторах: PyCharm, VS Code, редакторах на основі Jedi.
Я протестував кілька ідей у найпопулярніших Python-редакторах: PyCharm, VS Code, редакторах на основі Jedi.
За даними <ahref="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools"class="external-link"target="_blank">Python Developer Survey</a>, це охоплює близько 80% користувачів.
За даними [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), це охоплює близько 80% користувачів.
Це означає, що **FastAPI** спеціально тестувався з редакторами, якими користуються 80% розробників Python. І оскільки більшість інших редакторів працюють подібно, усі ці переваги мають працювати практично у всіх редакторах.
Це означає, що **FastAPI** спеціально тестувався з редакторами, якими користуються 80% розробників Python. І оскільки більшість інших редакторів працюють подібно, усі ці переваги мають працювати практично у всіх редакторах.
@ -54,11 +54,11 @@
## Вимоги { #requirements }
## Вимоги { #requirements }
Після перевірки кількох альтернатив я вирішив використовувати <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">**Pydantic**</a> через його переваги.
Після перевірки кількох альтернатив я вирішив використовувати [**Pydantic**](https://docs.pydantic.dev/) через його переваги.
Потім я зробив внески до нього, щоб зробити його повністю сумісним із Схемою JSON, додати підтримку різних способів оголошення обмежень і поліпшити підтримку редакторів (перевірки типів, автодоповнення) на основі тестів у кількох редакторах.
Потім я зробив внески до нього, щоб зробити його повністю сумісним із Схемою JSON, додати підтримку різних способів оголошення обмежень і поліпшити підтримку редакторів (перевірки типів, автодоповнення) на основі тестів у кількох редакторах.
Під час розробки я також зробив внески до <ahref="https://www.starlette.dev/"class="external-link"target="_blank">**Starlette**</a>, іншої ключової залежності.
Під час розробки я також зробив внески до [**Starlette**](https://www.starlette.dev/), іншої ключової залежності.
## Розробка { #development }
## Розробка { #development }
@ -76,4 +76,4 @@
**FastAPI** має велике майбутнє.
**FastAPI** має велике майбутнє.
І [ваша допомога](help-fastapi.md){.internal-link target=_blank} дуже цінується.
І [ваша допомога](help-fastapi.md) дуже цінується.
@ -44,7 +44,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
* **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією.
* **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією.
* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank">OpenAPI</a> (раніше відомий як Swagger) та <ahref="https://json-schema.org/"class="external-link"target="_blank">JSON Schema</a>.
* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (раніше відомий як Swagger) та [JSON Schema](https://json-schema.org/).
<small>* оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки.</small>
<small>* оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки.</small>
@ -55,51 +55,51 @@ FastAPI - це сучасний, швидкий (високопродуктив
"_[...] 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._"
"_[...] 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._"
"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
<divstyle="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong><ahref="https://eng.uber.com/ludwig-v0-2/"target="_blank"><small>(ref)</small></a></div>
<divstyle="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong><ahref="https://eng.uber.com/ludwig-v0-2/"><small>(ref)</small></a></div>
---
---
"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_"
"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **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._"
"_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._"
"_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._"
"_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._"
## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary }
## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary }
Наприкінці 2025 року вийшов <ahref="https://www.youtube.com/watch?v=mpR8ngthqiE"class="external-link"target="_blank">міні-документальний фільм про FastAPI</a>, ви можете переглянути його онлайн:
Наприкінці 2025 року вийшов [міні-документальний фільм про FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), ви можете переглянути його онлайн:
<ahref="https://www.youtube.com/watch?v=mpR8ngthqiE"target="_blank"><imgsrc="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg"alt="FastAPI Mini Documentary"></a>
<ahref="https://www.youtube.com/watch?v=mpR8ngthqiE"><imgsrc="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg"alt="FastAPI Mini Documentary"></a>
## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
Якщо ви створюєте застосунок <abbrtitle="Command Line Interface - Інтерфейс командного рядка">CLI</abbr> для використання в терміналі замість веб-API, зверніть увагу на <ahref="https://typer.tiangolo.com/"class="external-link"target="_blank">**Typer**</a>.
Якщо ви створюєте застосунок <abbrtitle="Command Line Interface - Інтерфейс командного рядка">CLI</abbr> для використання в терміналі замість веб-API, зверніть увагу на [**Typer**](https://typer.tiangolo.com/).
**Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀
**Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀
@ -135,12 +135,12 @@ FastAPI - це сучасний, швидкий (високопродуктив
FastAPI стоїть на плечах гігантів:
FastAPI стоїть на плечах гігантів:
* <ahref="https://www.starlette.dev/"class="external-link"target="_blank">Starlette</a> для вебчастини.
* [Starlette](https://www.starlette.dev/) для вебчастини.
* <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">Pydantic</a> для частини даних.
* [Pydantic](https://docs.pydantic.dev/) для частини даних.
## Встановлення { #installation }
## Встановлення { #installation }
Створіть і активуйте <ahref="https://fastapi.tiangolo.com/uk/virtual-environments/"class="external-link"target="_blank">віртуальне середовище</a>, а потім встановіть FastAPI:
Створіть і активуйте [віртуальне середовище](https://fastapi.tiangolo.com/uk/virtual-environments/), а потім встановіть FastAPI:
Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про <ahref="https://fastapi.tiangolo.com/uk/async/#in-a-hurry"target="_blank">`async` та `await` у документації</a>.
Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про [`async` та `await` у документації](https://fastapi.tiangolo.com/uk/async/#in-a-hurry).
<summary>Про команду <code>fastapi dev main.py</code>...</summary>
<summary>Про команду <code>fastapi dev</code>...</summary>
Команда `fastapi dev` читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою <ahref="https://www.uvicorn.dev"class="external-link"target="_blank">Uvicorn</a>.
Команда `fastapi dev`автоматично читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою [Uvicorn](https://www.uvicorn.dev).
За замовчуванням `fastapi dev` запускається з авто-перезавантаженням для локальної розробки.
За замовчуванням `fastapi dev` запускається з авто-перезавантаженням для локальної розробки.
Докладніше читайте в <ahref="https://fastapi.tiangolo.com/uk/fastapi-cli/"target="_blank">документації FastAPI CLI</a>.
Докладніше читайте в [документації FastAPI CLI](https://fastapi.tiangolo.com/uk/fastapi-cli/).
</details>
</details>
### Перевірте { #check-it }
### Перевірте { #check-it }
Відкрийте браузер і перейдіть на <ahref="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>.
Відкрийте браузер і перейдіть на [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery).
### Інтерактивна документація API { #interactive-api-docs }
### Інтерактивна документація API { #interactive-api-docs }
Тепер перейдіть на <ahref="http://127.0.0.1:8000/docs"class="external-link"target="_blank">http://127.0.0.1:8000/docs</a>.
Тепер перейдіть на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Ви побачите автоматичну інтерактивну документацію API (надану <ahref="https://github.com/swagger-api/swagger-ui"class="external-link"target="_blank">Swagger UI</a>):
Ви побачите автоматичну інтерактивну документацію API (надану [Swagger UI](https://github.com/swagger-api/swagger-ui)):
### Оновлення альтернативної документації API { #alternative-api-docs-upgrade }
### Оновлення альтернативної документації API { #alternative-api-docs-upgrade }
А тепер перейдіть на <ahref="http://127.0.0.1:8000/redoc"class="external-link"target="_blank">http://127.0.0.1:8000/redoc</a>.
А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
* Альтернативна документація також відобразить новий параметр запиту та тіло:
* Альтернативна документація також відобразить новий параметр запиту та тіло:
@ -442,7 +442,7 @@ item: Item
* Дуже потужну і просту у використанні систему **<dfntitle="також відоме як: компоненти, ресурси, провайдери, сервіси, інжектовані залежності">Впровадження залежностей</dfn>**.
* Дуже потужну і просту у використанні систему **<dfntitle="також відоме як: компоненти, ресурси, провайдери, сервіси, інжектовані залежності">Впровадження залежностей</dfn>**.
* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth.
* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth.
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
* Інтеграцію **GraphQL** з <ahref="https://strawberry.rocks"class="external-link"target="_blank">Strawberry</a> та іншими бібліотеками.
* Інтеграцію **GraphQL** з [Strawberry](https://strawberry.rocks) та іншими бібліотеками.
* Багато додаткових можливостей (завдяки Starlette) як-от:
* Багато додаткових можливостей (завдяки Starlette) як-от:
* **WebSockets**
* **WebSockets**
* надзвичайно прості тести на основі HTTPX та `pytest`
* надзвичайно прості тести на основі HTTPX та `pytest`
За бажання ви можете розгорнути ваш застосунок FastAPI у <ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>, перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀
За бажання ви можете розгорнути ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀
Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
Перед розгортанням переконайтеся, що ви ввійшли в систему:
<divclass="termy">
```console
$ fastapi login
You are logged in to FastAPI Cloud 🚀
```
</div>
Потім розгорніть ваш застосунок:
<divclass="termy">
<divclass="termy">
```console
```console
@ -488,7 +474,7 @@ Deploying to FastAPI Cloud...
#### Про FastAPI Cloud { #about-fastapi-cloud }
#### Про FastAPI Cloud { #about-fastapi-cloud }
**<ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>** створено тим самим автором і командою, що стоять за **FastAPI**.
**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоять за **FastAPI**.
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
@ -504,9 +490,9 @@ FastAPI - open source проект і базується на стандарта
## Продуктивність { #performance }
## Продуктивність { #performance }
Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як <ahref="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). (*)
Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як [одні з найшвидших доступних Python-фреймворків](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*)
Щоб дізнатися більше, перегляньте розділ <ahref="https://fastapi.tiangolo.com/uk/benchmarks/"class="internal-link"target="_blank">Benchmarks</a>.
Щоб дізнатися більше, перегляньте розділ [Benchmarks](https://fastapi.tiangolo.com/uk/benchmarks/).
## Залежності { #dependencies }
## Залежності { #dependencies }
@ -518,19 +504,19 @@ FastAPI залежить від Pydantic і Starlette.
Використовується Pydantic:
Використовується Pydantic:
* <ahref="https://github.com/JoshData/python-email-validator"target="_blank"><code>email-validator</code></a> - для валідації електронної пошти.
* [`email-validator`](https://github.com/JoshData/python-email-validator) - для валідації електронної пошти.
Використовується Starlette:
Використовується Starlette:
* <ahref="https://www.python-httpx.org"target="_blank"><code>httpx</code></a> - потрібно, якщо ви хочете використовувати `TestClient`.
* [`httpx`](https://www.python-httpx.org) - потрібно, якщо ви хочете використовувати `TestClient`.
* <ahref="https://jinja.palletsprojects.com"target="_blank"><code>jinja2</code></a> - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
* [`jinja2`](https://jinja.palletsprojects.com) - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
* <ahref="https://github.com/Kludex/python-multipart"target="_blank"><code>python-multipart</code></a> - потрібно, якщо ви хочете підтримувати форми з <dfntitle="перетворення строки, що надходить із HTTP-запиту, у дані Python">«парсингом»</dfn> через `request.form()`.
* [`python-multipart`](https://github.com/Kludex/python-multipart) - потрібно, якщо ви хочете підтримувати форми з <dfntitle="перетворення строки, що надходить із HTTP-запиту, у дані Python">«парсингом»</dfn> через `request.form()`.
Використовується FastAPI:
Використовується FastAPI:
* <ahref="https://www.uvicorn.dev"target="_blank"><code>uvicorn</code></a> - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера.
* [`uvicorn`](https://www.uvicorn.dev) - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера.
* `fastapi-cli[standard]` - щоб надати команду `fastapi`.
* `fastapi-cli[standard]` - щоб надати команду `fastapi`.
* Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у <ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>.
* Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com).
### Без залежностей `standard` { #without-standard-dependencies }
### Без залежностей `standard` { #without-standard-dependencies }
@ -546,13 +532,13 @@ FastAPI залежить від Pydantic і Starlette.
Додаткові необовʼязкові залежності Pydantic:
Додаткові необовʼязкові залежності Pydantic:
* <ahref="https://docs.pydantic.dev/latest/usage/pydantic_settings/"target="_blank"><code>pydantic-settings</code></a> - для керування налаштуваннями.
* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - для керування налаштуваннями.
* <ahref="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/"target="_blank"><code>pydantic-extra-types</code></a> - для додаткових типів, що можуть бути використані з Pydantic.
* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - для додаткових типів, що можуть бути використані з Pydantic.
Додаткові необовʼязкові залежності FastAPI:
Додаткові необовʼязкові залежності FastAPI:
* <ahref="https://github.com/ijl/orjson"target="_blank"><code>orjson</code></a> - потрібно, якщо ви хочете використовувати `ORJSONResponse`.
* [`orjson`](https://github.com/ijl/orjson) - потрібно, якщо ви хочете використовувати `ORJSONResponse`.
* <ahref="https://github.com/esnme/ultrajson"target="_blank"><code>ujson</code></a> - потрібно, якщо ви хочете використовувати `UJSONResponse`.
* [`ujson`](https://github.com/esnme/ultrajson) - потрібно, якщо ви хочете використовувати `UJSONResponse`.
Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API.
Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API.
Репозиторій GitHub: <ahref="https://github.com/tiangolo/full-stack-fastapi-template"class="external-link"target="_blank">Шаблон Full Stack FastAPI</a>
Репозиторій GitHub: [Шаблон Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template)
## Шаблон Full Stack FastAPI - стек технологій і можливості { #full-stack-fastapi-template-technology-stack-and-features }
## Шаблон Full Stack FastAPI - стек технологій і можливості { #full-stack-fastapi-template-technology-stack-and-features }
* який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
* який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md).
Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас.
Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас.
/// info | Інформація
/// info | Інформація
Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: <ahref="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html"class="external-link"target="_blank">«шпаргалка» від `mypy`</a>.
Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: [«шпаргалка» від `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html).
Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, жодне значення не буде передано вашій *функції операції шляху*.
Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md), жодне значення не буде передано вашій *функції операції шляху*.
* Усі вони включатимуть наперед визначені `responses`.
* Усі вони включатимуть наперед визначені `responses`.
* Для всіх цих *операцій шляху* список `dependencies` буде оцінений/виконаний перед ними.
* Для всіх цих *операцій шляху* список `dependencies` буде оцінений/виконаний перед ними.
* Якщо ви також оголосите залежності в конкретній *операції шляху*, **вони також будуть виконані**.
* Якщо ви також оголосите залежності в конкретній *операції шляху*, **вони також будуть виконані**.
* Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, а потім звичайні параметричні залежності.
* Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md), а потім звичайні параметричні залежності.
* Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}.
* Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md).
/// tip | Порада
/// tip | Порада
@ -303,7 +303,7 @@ from ...dependencies import get_token_header
Імпортуйте та створіть клас `FastAPI`, як зазвичай.
Імпортуйте та створіть клас `FastAPI`, як зазвичай.
І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md){.internal-link target=_blank}, які будуть поєднані із залежностями кожного `APIRouter`:
І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md), які будуть поєднані із залежностями кожного `APIRouter`:
@ -353,7 +353,7 @@ from .routers import items, users
from app.routers import items, users
from app.routers import items, users
```
```
Щоб дізнатися більше про пакети й модулі Python, прочитайте <ahref="https://docs.python.org/3/tutorial/modules.html"class="external-link"target="_blank">офіційну документацію Python про модулі</a>.
Щоб дізнатися більше про пакети й модулі Python, прочитайте [офіційну документацію Python про модулі](https://docs.python.org/3/tutorial/modules.html).
///
///
@ -465,6 +465,37 @@ from .routers.users import router
///
///
## Налаштуйте `entrypoint` у `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml }
Оскільки ваш об'єкт FastAPI `app` знаходиться в `app/main.py`, ви можете налаштувати `entrypoint` у файлі `pyproject.toml` так:
```toml
[tool.fastapi]
entrypoint = "app.main:app"
```
це еквівалентно імпорту:
```python
from app.main import app
```
Таким чином команда `fastapi` знатиме, де знайти ваш застосунок.
/// Note | Примітка
Ви також могли б передати шлях команді, наприклад:
```console
$ fastapi dev app/main.py
```
Але тоді вам доведеться щоразу пам'ятати, щоб передавати правильний шлях, коли ви викликаєте команду `fastapi`.
Крім того, інші інструменти можуть не знайти його, наприклад [розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендовано використовувати `entrypoint` у `pyproject.toml`.
///
## Перевірте автоматичну документацію API { #check-the-automatic-api-docs }
## Перевірте автоматичну документацію API { #check-the-automatic-api-docs }
Тепер запустіть ваш застосунок:
Тепер запустіть ваш застосунок:
@ -472,14 +503,14 @@ from .routers.users import router
<divclass="termy">
<divclass="termy">
```console
```console
$ fastapi dev app/main.py
$ fastapi dev
<spanstyle="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
<spanstyle="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
```
</div>
</div>
І відкрийте документацію за адресою <ahref="http://127.0.0.1:8000/docs"class="external-link"target="_blank">http://127.0.0.1:8000/docs</a>.
І відкрийте документацію за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Ви побачите автоматичну документацію API, що включає шляхи з усіх підмодулів, з правильними шляхами (і префіксами) та правильними мітками:
Ви побачите автоматичну документацію API, що включає шляхи з усіх підмодулів, з правильними шляхами (і префіксами) та правильними мітками:
## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put }
## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put }
Щоб оновити елемент, ви можете використати <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT"class="external-link"target="_blank">HTTP `PUT`</a> операцію.
Щоб оновити елемент, ви можете використати [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) операцію.
Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`.
Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`.
@ -28,7 +28,7 @@
## Часткові оновлення з `PATCH` { #partial-updates-with-patch }
## Часткові оновлення з `PATCH` { #partial-updates-with-patch }
Ви також можете використовувати операцію <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH"class="external-link"target="_blank">HTTP `PATCH`</a> для *часткового* оновлення даних.
Ви також можете використовувати операцію [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) для *часткового* оновлення даних.
Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.
Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.
@ -95,6 +95,6 @@
Тож, якщо Ви хочете отримувати часткові оновлення, які можуть пропускати всі атрибути, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
Тож, якщо Ви хочете отримувати часткові оновлення, які можуть пропускати всі атрибути, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}.
Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md).
# CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing }
# CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing }
<ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS"class="external-link"target="_blank">CORS або «Cross-Origin Resource Sharing»</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin).
[CORS або «Cross-Origin Resource Sharing»](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin).
## Джерело (Origin) { #origin }
## Джерело (Origin) { #origin }
@ -29,7 +29,7 @@
Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел.
Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел.
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо.
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: кукі, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо.
Тому для коректної роботи краще явно вказувати дозволені джерела.
Тому для коректної роботи краще явно вказувати дозволені джерела.
@ -43,7 +43,7 @@
Також можна вказати, чи дозволяє ваш бекенд:
Також можна вказати, чи дозволяє ваш бекенд:
* Облікові дані (заголовки авторизації, Cookies, тощо).
* Облікові дані (заголовки авторизації, кукі, тощо).
* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
* Конкретні HTTP-заголовки або всі за допомогою `"*"`.
* Конкретні HTTP-заголовки або всі за допомогою `"*"`.
@ -58,10 +58,10 @@
* `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_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`.
* `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи.
* `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи.
* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests"class="external-link"rel="noopener"target="_blank">простих CORS-запитів</a>.
* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для [простих CORS-запитів](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests).
* `allow_credentials` - Визначає, чи повинні підтримуватися cookies для міждоменних запитів. За замовчуванням `False`.
* `allow_credentials` - Визначає, чи повинні підтримуватися кукі для міждоменних запитів. За замовчуванням `False`.
Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards"class="external-link"rel="noopener"target="_blank">явно вказані</a>.
Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути [явно вказані](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards).
* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
@ -72,20 +72,20 @@
Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`.
Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`.
У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей.
У такому випадку проміжне програмне забезпечення перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей.
### Прості запити { #simple-requests }
### Прості запити { #simple-requests }
Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь.
Будь-які запити із заголовком `Origin`. У цьому випадку проміжне програмне забезпечення пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь.
## Додаткова інформація { #more-info }
## Додаткова інформація { #more-info }
Більше про <abbrtitle="Cross-Origin Resource Sharing - Обмін ресурсами між різними джерелами">CORS</abbr> можна дізнатися в <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS"class="external-link"target="_blank">документації Mozilla про CORS</a>.
Більше про <abbrtitle="Cross-Origin Resource Sharing - Обмін ресурсами між різними джерелами">CORS</abbr> можна дізнатися в [документації Mozilla про CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
/// note | Технічні деталі
/// note | Технічні деталі
Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`.
Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`.
**FastAPI** надає кілька middleware у `fastapi.middleware` для зручності розробників. Але більшість доступних middleware походять безпосередньо зі Starlette.
**FastAPI** надає кілька проміжних програмних забезпечень у `fastapi.middleware` для зручності розробників. Але більшість доступного проміжного програмного забезпечення походить безпосередньо зі Starlette.
у цьому випадку автоматично створена змінна `__name__` всередині `myapp.py` не матиме значення `"__main__"`.
у цьому випадку автоматично створена змінна `__name__` всередині `myapp.py` не матиме значення `"__main__"`.
@ -72,9 +72,9 @@ from myapp import app
не буде виконано.
не буде виконано.
/// info | Інформація
/// info
Для отримання додаткової інформації дивіться <ahref="https://docs.python.org/3/library/__main__.html"class="external-link"target="_blank">офіційну документацію Python</a>.
Для отримання додаткової інформації дивіться [офіційну документацію Python](https://docs.python.org/3/library/__main__.html).
Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON.
Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON.
Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в <ahref="https://en.wikipedia.org/wiki/ISO_8601"class="external-link"target="_blank">форматі ISO</a>.
Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в [форматі ISO](https://en.wikipedia.org/wiki/ISO_8601).
Так само ця база даних не прийматиме модель Pydantic (об'єкт з атрибутами), а лише `dict`.
Так само ця база даних не прийматиме модель Pydantic (об'єкт з атрибутами), а лише `dict`.
@ -24,7 +24,7 @@
У цьому прикладі вона конвертує модель Pydantic у `dict`, а `datetime` у `str`.
У цьому прикладі вона конвертує модель Pydantic у `dict`, а `datetime` у `str`.
Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python <ahref="https://docs.python.org/3/library/json.html#json.dumps"class="external-link"target="_blank">`json.dumps()`</a>.
Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps).
Вона не повертає великий `str`, який містить дані у форматі JSON (як рядок). Вона повертає стандартну структуру даних Python (наприклад, `dict`) зі значеннями та підзначеннями, які є сумісними з JSON.
Вона не повертає великий `str`, який містить дані у форматі JSON (як рядок). Вона повертає стандартну структуру даних Python (наприклад, `dict`) зі значеннями та підзначеннями, які є сумісними з JSON.
* У запитах та відповідях буде представлений як `float` загальної кількості секунд.
* У запитах та відповідях буде представлений як `float` загальної кількості секунд.
* Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", <ahref="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers"class="external-link"target="_blank">дивіться документацію для отримання додаткової інформації</a>.
* Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* `frozenset`:
* `frozenset`:
* У запитах і відповідях це буде оброблено так само, як і `set`:
* У запитах і відповідях це буде оброблено так само, як і `set`:
* У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`.
* У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`.
@ -49,7 +49,7 @@
* `Decimal`:
* `Decimal`:
* Стандартний Пайтонівський `Decimal`.
* Стандартний Пайтонівський `Decimal`.
* У запитах і відповідях це буде оброблено так само, як і `float`.
* У запитах і відповідях це буде оброблено так само, як і `float`.
* Ви можете перевірити всі дійсні типи даних Pydantic тут: <ahref="https://docs.pydantic.dev/latest/usage/types/types/"class="external-link"target="_blank">типи даних Pydantic</a>.
* Ви можете перевірити всі дійсні типи даних Pydantic тут: [типи даних Pydantic](https://docs.pydantic.dev/latest/usage/types/types/).
...тому що `user_in.model_dump()`повертає`dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`.
...тому що `user_in.model_dump()`- це`dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`.
Тож ми отримуємо модель Pydantic з даних іншої моделі Pydantic.
Тож ми отримуємо модель Pydantic з даних іншої моделі Pydantic.
@ -162,11 +162,11 @@ UserInDB(
В OpenAPI це буде визначено як `anyOf`.
В OpenAPI це буде визначено як `anyOf`.
Для цього використайте стандартну підказку типу Python <ahref="https://docs.python.org/3/library/typing.html#typing.Union"class="external-link"target="_blank">`typing.Union`</a>:
Для цього використайте стандартну підказку типу Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union):
/// note | Примітка
/// note | Примітка
Під час визначення <ahref="https://docs.pydantic.dev/latest/concepts/types/#unions"class="external-link"target="_blank">`Union`</a> спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`.
Під час визначення [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`.
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@ -58,7 +58,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
### Перевірте { #check-it }
### Перевірте { #check-it }
Відкрийте браузер та введіть адресу <ahref="http://127.0.0.1:8000"class="external-link"target="_blank">http://127.0.0.1:8000</a>.
Відкрийте браузер за адресою [http://127.0.0.1:8000](http://127.0.0.1:8000).
Ви побачите JSON-відповідь:
Ви побачите JSON-відповідь:
@ -68,17 +68,17 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
### Інтерактивна API документація { #interactive-api-docs }
### Інтерактивна API документація { #interactive-api-docs }
Тепер перейдіть сюди <ahref="http://127.0.0.1:8000/docs"class="external-link"target="_blank">http://127.0.0.1:8000/docs</a>.
Тепер перейдіть сюди [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Ви побачите автоматичну інтерактивну API документацію (надається <ahref="https://github.com/swagger-api/swagger-ui"class="external-link"target="_blank">Swagger UI</a>):
Ви побачите автоматичну інтерактивну API документацію (надається [Swagger UI](https://github.com/swagger-api/swagger-ui)):
@ -92,7 +92,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
#### API «схема» { #api-schema }
#### API «схема» { #api-schema }
У цьому випадку, <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank">OpenAPI</a> є специфікацією, яка визначає, як описати схему вашого API.
У цьому випадку, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) є специфікацією, яка визначає, як описати схему вашого API.
Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо.
Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо.
@ -110,7 +110,7 @@ OpenAPI описує схему API для вашого API. І ця схема
Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API.
Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API.
Ви можете побачити це напряму тут: <ahref="http://127.0.0.1:8000/openapi.json"class="external-link"target="_blank">http://127.0.0.1:8000/openapi.json</a>.
Ви можете побачити це напряму тут: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:800api.json).
Ви побачите JSON, що починається приблизно так:
Ви побачите JSON, що починається приблизно так:
@ -143,9 +143,58 @@ OpenAPI schema — це те, на чому працюють дві включе
Ви також можете використовувати його для автоматичної генерації коду для клієнтів, які взаємодіють з вашим API. Наприклад, для фронтенд-, мобільних або IoT-застосунків.
Ви також можете використовувати його для автоматичної генерації коду для клієнтів, які взаємодіють з вашим API. Наприклад, для фронтенд-, мобільних або IoT-застосунків.
### Налаштуйте `entrypoint` застосунку в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
Ви можете налаштувати, де знаходиться ваш застосунок, у файлі `pyproject.toml`, приблизно так:
```toml
[tool.fastapi]
entrypoint = "main:app"
```
Цей `entrypoint` повідомить команді `fastapi`, що вона має імпортувати застосунок так:
```python
from main import app
```
Якщо структура вашого коду виглядала б так:
```
.
├── backend
│ ├── main.py
│ ├── __init__.py
```
Тоді ви б задали `entrypoint` як:
```toml
[tool.fastapi]
entrypoint = "backend.main:app"
```
що було б еквівалентно:
```python
from backend.main import app
```
### `fastapi dev` із шляхом { #fastapi-dev-with-path }
Ви також можете передати шлях до файлу в команду `fastapi dev`, і вона вгадає обʼєкт FastAPI app, який слід використовувати:
```console
$ fastapi dev main.py
```
Але вам доведеться щоразу памʼятати передавати правильний шлях під час виклику команди `fastapi`.
Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`.
За бажанням ви можете розгорнути ваш FastAPI-застосунок у <ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>, перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀
За бажанням ви можете розгорнути ваш FastAPI-застосунок у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀
Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
@ -191,7 +240,7 @@ Deploying to FastAPI Cloud...
`FastAPI` — це клас, який успадковується безпосередньо від `Starlette`.
`FastAPI` — це клас, який успадковується безпосередньо від `Starlette`.
Ви також можете використовувати всю функціональність <ahref="https://www.starlette.dev/"class="external-link"target="_blank">Starlette</a> у `FastAPI`.
Ви також можете використовувати всю функціональність [Starlette](https://www.starlette.dev/) у `FastAPI`.
///
///
@ -336,7 +385,7 @@ https://example.com/items/foo
/// note
/// note
Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry){.internal-link target=_blank}.
Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry).
Розгорніть ваш застосунок у **<ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>** однією командою: `fastapi deploy`. 🎉
Розгорніть ваш застосунок у **[FastAPI Cloud](https://fastapicloud.com)** однією командою: `fastapi deploy`. 🎉
#### Про FastAPI Cloud { #about-fastapi-cloud }
#### Про FastAPI Cloud { #about-fastapi-cloud }
**<ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>** створено тим самим автором і командою, які стоять за **FastAPI**.
**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, які стоять за **FastAPI**.
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями.
### Отримана відповідь { #the-resulting-response }
### Отримана відповідь { #the-resulting-response }
Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id``"foo"`), він отримає HTTP статус-код 200 і JSON відповідь:
Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id``"foo"`), він отримає код статусу HTTP 200 і JSON відповідь:
```JSON
```JSON
{
{
@ -51,7 +51,7 @@
}
}
```
```
Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає HTTP статус-код 404 (помилка «не знайдено») та JSON відповідь:
Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає код статусу HTTP 404 (помилка «не знайдено») та JSON відповідь:
```JSON
```JSON
{
{
@ -81,7 +81,7 @@
## Встановлення власних обробників виключень { #install-custom-exception-handlers }
## Встановлення власних обробників виключень { #install-custom-exception-handlers }
Ви можете додати власні обробники виключень за допомогою <ahref="https://www.starlette.dev/exceptions/"class="external-link"target="_blank">тих самих утиліт для виключень зі Starlette</a>.
Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://www.starlette.dev/exceptions/).
Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`.
Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`.
@ -95,7 +95,7 @@
Але вона буде оброблена функцією-обробником `unicorn_exception_handler`.
Але вона буде оброблена функцією-обробником `unicorn_exception_handler`.
Отже, ви отримаєте зрозумілу помилку зі HTTP-статусом`418` і JSON-вмістом:
Отже, ви отримаєте зрозумілу помилку з кодом статусу HTTP`418` і JSON-вмістом:
```JSON
```JSON
{"message": "Oops! yolo did something. There goes a rainbow..."}
{"message": "Oops! yolo did something. There goes a rainbow..."}
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
<spanstyle="background-color:#009485"><fontcolor="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
@ -62,7 +62,7 @@ $ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid
Першим кроком є встановлення FastAPI.
Першим кроком є встановлення FastAPI.
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім **встановіть FastAPI**:
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім **встановіть FastAPI**:
Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в <ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>.
Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в [FastAPI Cloud](https://fastapicloud.com).
Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`.
Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`.
FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud — усе безпосередньо з вашого редактора.
Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**.
Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Навчальний посібник - Посібник користувача**.
**Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям.
**Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям.
Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте).
Але вам слід спочатку прочитати **Навчальний посібник - Посібник користувача** (те, що ви зараз читаєте).
Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**.
Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Навчальний посібник - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**.
Якщо у вас є залежності з `yield`, код виходу виконається *після* middleware.
Якщо у вас є залежності з `yield`, код виходу виконається *після* middleware.
Якщо були заплановані фонові задачі (розглянуто в розділі [Background Tasks](background-tasks.md){.internal-link target=_blank}, ви побачите це пізніше), вони виконаються *після* всіх middleware.
Якщо були заплановані фонові задачі (розглянуто в розділі [Фонові задачі](background-tasks.md), ви побачите це пізніше), вони виконаються *після* всіх middleware.
///
///
@ -35,9 +35,9 @@
/// tip
/// tip
Пам’ятайте, що власні пропрієтарні заголовки можна додавати <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers"class="external-link"target="_blank">використовуючи префікс `X-`</a>.
Пам’ятайте, що власні пропрієтарні заголовки можна додавати [використовуючи префікс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) за допомогою параметра `expose_headers`, описаного в <ahref="https://www.starlette.dev/middleware/#corsmiddleware"class="external-link"target="_blank">документації Starlette по CORS</a>.
Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Спільне використання ресурсів між джерелами)](cors.md)) за допомогою параметра `expose_headers`, описаного в [документації Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware).
///
///
@ -61,7 +61,7 @@
/// tip
/// tip
Тут ми використовуємо <ahref="https://docs.python.org/3/library/time.html#time.perf_counter"class="external-link"target="_blank">`time.perf_counter()`</a> замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
Тут ми використовуємо [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
///
///
@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB)
## Інші middlewares { #other-middlewares }
## Інші middlewares { #other-middlewares }
Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
Ви можете пізніше прочитати більше про інші middlewares у [просунутому посібнику користувача: просунуте middleware](../advanced/middleware.md).
Ви дізнаєтесь, як обробляти <abbrtitle="Cross-Origin Resource Sharing - Спільне використання ресурсів між джерелами">CORS</abbr> за допомогою middleware в наступному розділі.
Ви дізнаєтесь, як обробляти <abbrtitle="Cross-Origin Resource Sharing - Спільне використання ресурсів між джерелами">CORS</abbr> за допомогою middleware в наступному розділі.
Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`.
Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`.
Отже, якщо ви запустите цей приклад і перейдете за посиланням <ahref="http://127.0.0.1:8000/items/foo"class="external-link"target="_blank">http://127.0.0.1:8000/items/foo</a>, то побачите відповідь:
Отже, якщо ви запустите цей приклад і перейдете за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), то побачите відповідь:
```JSON
```JSON
{"item_id":"foo"}
{"item_id":"foo"}
@ -28,7 +28,7 @@
## <dfntitle="також відомо як: серіалізація, парсинг, маршалізація">Перетворення</dfn> даних { #data-conversion }
## <dfntitle="також відомо як: серіалізація, парсинг, маршалізація">Перетворення</dfn> даних { #data-conversion }
Якщо ви запустите цей приклад і відкриєте у браузері <ahref="http://127.0.0.1:8000/items/3"class="external-link"target="_blank">http://127.0.0.1:8000/items/3</a>, то побачите відповідь:
Якщо ви запустите цей приклад і відкриєте у браузері [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), то побачите відповідь:
```JSON
```JSON
{"item_id":3}
{"item_id":3}
@ -44,7 +44,7 @@
## Валідація даних { #data-validation }
## Валідація даних { #data-validation }
Але якщо ви перейдете у браузері за посиланням <ahref="http://127.0.0.1:8000/items/foo"class="external-link"target="_blank">http://127.0.0.1:8000/items/foo</a>, ви побачите гарну HTTP-помилку:
Але якщо ви перейдете у браузері за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), ви побачите гарну HTTP-помилку:
```JSON
```JSON
{
{
@ -64,7 +64,7 @@
тому що параметр шляху `item_id` мав значення `"foo"`, яке не є `int`.
тому що параметр шляху `item_id` мав значення `"foo"`, яке не є `int`.
Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: <ahref="http://127.0.0.1:8000/items/4.2"class="external-link"target="_blank">http://127.0.0.1:8000/items/4.2</a>
Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
/// check | Перевірте
/// check | Перевірте
@ -78,7 +78,7 @@
## Документація { #documentation }
## Документація { #documentation }
А коли ви відкриєте у браузері <ahref="http://127.0.0.1:8000/docs"class="external-link"target="_blank">http://127.0.0.1:8000/docs</a>, ви побачите автоматичну, інтерактивну, API-документацію на кшталт:
А коли ви відкриєте у браузері [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), ви побачите автоматичну, інтерактивну, API-документацію на кшталт:
І оскільки згенерована схема відповідає стандарту <ahref="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md"class="external-link"target="_blank">OpenAPI</a>, існує багато сумісних інструментів.
І оскільки згенерована схема відповідає стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), існує багато сумісних інструментів.
Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням <ahref="http://127.0.0.1:8000/redoc"class="external-link"target="_blank">http://127.0.0.1:8000/redoc</a>:
Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc):
<imgsrc="/img/tutorial/path-params/image02.png">
<imgsrc="/img/tutorial/path-params/image02.png">
@ -102,7 +102,7 @@
## Pydantic { #pydantic }
## Pydantic { #pydantic }
Уся валідація даних виконується за лаштунками за допомогою <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">Pydantic</a>, тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках.
Уся валідація даних виконується за лаштунками за допомогою [Pydantic](https://docs.pydantic.dev/), тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках.
Ви можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних.
Ви можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних.
@ -35,13 +35,13 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
Якщо у вас старіша версія, під час використання `Annotated` можуть виникати помилки.
Якщо у вас старіша версія, під час використання `Annotated` можуть виникати помилки.
Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`.
Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) до принаймні 0.95.1, перш ніж використовувати `Annotated`.
///
///
## Використання `Annotated` у типі параметра `q` { #use-annotated-in-the-type-for-the-q-parameter }
## Використання `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}?
Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations)?
Зараз саме час використати його разом із FastAPI. 🚀
Зараз саме час використати його разом із FastAPI. 🚀
@ -157,7 +157,7 @@ q: str = Query(default="rick")
Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <ahref="https://typer.tiangolo.com/"class="external-link"target="_blank">Typer</a>. 🚀
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як [Typer](https://typer.tiangolo.com/). 🚀
## Додавання додаткових валідацій { #add-more-validations }
## Додавання додаткових валідацій { #add-more-validations }
Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо значення дорівнює `None`.
Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо значення дорівнює `None`.
Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вказуйте значення за замовчуванням:
Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вкажіть значення за замовчуванням:
У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
Це можна досягти за допомогою <ahref="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator"class="external-link"target="_blank">Pydantic's `AfterValidator`</a> в середині `Annotated`.
Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) в середині `Annotated`.
/// tip | Порада
/// tip | Порада
Pydantic також має <ahref="https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator"class="external-link"target="_blank">`BeforeValidator`</a> та інші. 🤓
Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) та інші. 🤓
Щоб використовувати форми, спочатку встановіть <ahref="https://github.com/Kludex/python-multipart"class="external-link"target="_blank">`python-multipart`</a>.
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, і потім встановили бібліотеку, наприклад:
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, і потім встановили бібліотеку, наприклад:
```console
```console
$ pip install python-multipart
$ pip install python-multipart
@ -56,7 +56,7 @@ HTML-форми (`<form></form>`) надсилають дані на серве
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі.
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі.
Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> вебдокументації для <code>POST</code></a>.
Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до [<abbr title="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> вебдокументації для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
@ -13,6 +13,7 @@ FastAPI використовуватиме цей тип повернення,
* Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*.
* Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*.
* Це буде використано в **автоматичній документації**.
* Це буде використано в **автоматичній документації**.
* Це також буде використано інструментами, які автоматично генерують клієнтський код.
* Це також буде використано інструментами, які автоматично генерують клієнтський код.
* **Серіалізувати** повернені дані в JSON за допомогою Pydantic, який написаний мовою **Rust**, тому це буде **набагато швидше**.
Але найголовніше:
Але найголовніше:
@ -73,9 +74,9 @@ FastAPI використовуватиме цей `response_model` для вик
/// info | Інформація
/// info | Інформація
Щоб використовувати `EmailStr`, спочатку встановіть <ahref="https://github.com/JoshData/python-email-validator"class="external-link"target="_blank">`email-validator`</a>.
Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator).
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад:
Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили пакет, наприклад:
Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всіх застережень і точно розумієте, що робите.
Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всі застереження і точно розумієте, що робите.
///
///
@ -181,7 +182,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
### Повернути Response напряму { #return-a-response-directly }
### Повернути Response напряму { #return-a-response-directly }
Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}.
Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md).
@ -257,7 +258,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
* `response_model_exclude_defaults=True`
* `response_model_exclude_defaults=True`
* `response_model_exclude_none=True`
* `response_model_exclude_none=True`
як описано в <ahref="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict"class="external-link"target="_blank">документації Pydantic</a> для `exclude_defaults` та `exclude_none`.
як описано в [документації Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) для `exclude_defaults` та `exclude_none`.
`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python <ahref="https://docs.python.org/3/library/http.html#http.HTTPStatus"class="external-link"target="_blank">`http.HTTPStatus`</a>.
`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus).
///
///
@ -66,7 +66,7 @@ FastAPI знає про це і створить документацію OpenAP
/// tip | Порада
/// tip | Порада
Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте документацію <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> про HTTP коди статусу</a>.
Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте [документацію <abbr title="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> про HTTP коди статусу](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).
///
///
@ -98,4 +98,4 @@ FastAPI знає про це і створить документацію OpenAP
## Зміна значення за замовчуванням { #changing-the-default }
## Зміна значення за замовчуванням { #changing-the-default }
Пізніше, у [Посібнику для досвідчених користувачів](../advanced/response-change-status-code.md){.internal-link target=_blank}, ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут.
Пізніше, у [Просунутому посібнику користувача](../advanced/response-change-status-code.md), ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут.
На цій сторінці ви дізнаєтеся, як використовувати віртуальні середовища і як вони працюють.
На цій сторінці ви дізнаєтеся, як використовувати віртуальні середовища і як вони працюють.
Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте <ahref="https://github.com/astral-sh/uv"class="external-link"target="_blank">uv</a>.
Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv).
///
///
@ -86,7 +86,7 @@ $ python -m venv .venv
//// tab | `uv`
//// tab | `uv`
Якщо у вас встановлено <ahref="https://github.com/astral-sh/uv"class="external-link"target="_blank">`uv`</a>, ви можете використати його для створення віртуального середовища.
Якщо у вас встановлено [`uv`](https://github.com/astral-sh/uv), ви можете використати його для створення віртуального середовища.
<divclass="termy">
<divclass="termy">
@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1
//// tab | Windows Bash
//// tab | Windows Bash
Або якщо ви використовуєте Bash для Windows (напр., <ahref="https://gitforwindows.org/"class="external-link"target="_blank">Git Bash</a>):
Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
Якщо ви використовуєте <ahref="https://github.com/astral-sh/uv"class="external-link"target="_blank">`uv`</a>, ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎
Якщо ви використовуєте [`uv`](https://github.com/astral-sh/uv), ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎
Якщо ви використали <ahref="https://github.com/astral-sh/uv"class="external-link"target="_blank">`uv`</a> для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎
Якщо ви використали [`uv`](https://github.com/astral-sh/uv) для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎
Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md){.internal-link target=_blank}, які будуть доступні для наступних команд.
Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md), які будуть доступні для наступних команд.
Однією з цих змінних є змінна `PATH`.
Однією з цих змінних є змінна `PATH`.
/// tip | Порада
/// tip | Порада
Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable){.internal-link target=_blank}.
Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable).
///
///
@ -844,7 +844,7 @@ I solemnly swear 🐺
Існує багато альтернатив керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами.
Існує багато альтернатив керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами.
Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати <ahref="https://github.com/astral-sh/uv"class="external-link"target="_blank">uv</a>.
Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv).