🌐 Update translations for uk (update-all) (#14914)

* Update all

* 🎨 Auto format

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
Motov Yurii 2026-02-13 13:42:01 +01:00 committed by GitHub
parent ea8db708f1
commit 685cc0de17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 303 additions and 452 deletions

View File

@ -58,9 +58,9 @@ Flask — це «мікрофреймворк», він не включає ін
/// check | Надихнуло **FastAPI** на /// check | Надихнуло **FastAPI** на
Бути мікрофреймоворком. Зробити легким комбінування та поєднання необхідних інструментів та частин. Бути мікрофреймворком. Зробити легким комбінування та поєднання необхідних інструментів та частин.
Мати просту та легку у використанні систему маршрутизації. Мати просту та легку у використанні систему маршрутизації.
/// ///
@ -100,9 +100,9 @@ def read_url():
/// check | Надихнуло **FastAPI** на /// check | Надихнуло **FastAPI** на
* Майте простий та інтуїтивно зрозумілий API. * Мати простий та інтуїтивно зрозумілий API.
* Використовуйте імена (операції) методів HTTP безпосередньо, простим та інтуїтивно зрозумілим способом. * Використовувати імена (операції) методів HTTP безпосередньо, простим та інтуїтивно зрозумілим способом.
* Розумні параметри за замовчуванням, але потужні налаштування. * Мати розумні параметри за замовчуванням, але потужні налаштування.
/// ///
@ -122,12 +122,12 @@ def read_url():
Прийняти і використовувати відкритий стандарт для специфікацій API замість спеціальної схеми. Прийняти і використовувати відкритий стандарт для специфікацій API замість спеціальної схеми.
Інтегрувати інструменти інтерфейсу на основі стандартів: Інтегрувати інструменти інтерфейсу на основі стандартів:
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Інтерфейс Swagger</a> * <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Інтерфейс Swagger</a>
* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> * <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**). Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
/// ///
@ -137,7 +137,7 @@ def read_url():
### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow } ### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow }
Однією з головних функцій, необхідних для систем API, є "<abbr title="також звана marshalling, conversion">серіалізація</abbr>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо. Однією з головних функцій, необхідних для систем API, є "<dfn title="також відома як: marshalling, перетворення">серіалізація</dfn>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних. Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних.
@ -145,7 +145,7 @@ def read_url():
Marshmallow створено для забезпечення цих функцій. Це чудова бібліотека, і я часто нею користувався раніше. Marshmallow створено для забезпечення цих функцій. Це чудова бібліотека, і я часто нею користувався раніше.
Але він був створений до того, як існували підказки типу Python. Отже, щоб визначити кожну <abbr title="визначення того, як дані повинні бути сформовані">схему</abbr>, вам потрібно використовувати спеціальні утиліти та класи, надані Marshmallow. Але він був створений до того, як існували підказки типу Python. Отже, щоб визначити кожну <dfn title="визначення того, як дані повинні бути сформовані">схему</dfn>, вам потрібно використовувати спеціальні утиліти та класи, надані Marshmallow.
/// check | Надихнуло **FastAPI** на /// check | Надихнуло **FastAPI** на
@ -155,7 +155,7 @@ Marshmallow створено для забезпечення цих функці
### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs } ### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs }
Іншою важливою функцією, необхідною для API, є <abbr title="читання та перетворення даних Python">аналіз</abbr> даних із вхідних запитів. Іншою важливою функцією, необхідною для API, є <dfn title="читання та перетворення на дані Python">аналіз</dfn> даних із вхідних запитів.
Webargs — це інструмент, створений, щоб забезпечити це поверх кількох фреймворків, включаючи Flask. Webargs — це інструмент, створений, щоб забезпечити це поверх кількох фреймворків, включаючи Flask.
@ -217,7 +217,7 @@ APISpec був створений тими ж розробниками Marshmall
Ця комбінація Flask, Flask-apispec із Marshmallow і Webargs була моїм улюбленим бекенд-стеком до створення **FastAPI**. Ця комбінація Flask, Flask-apispec із Marshmallow і Webargs була моїм улюбленим бекенд-стеком до створення **FastAPI**.
Їі використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі: Її використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі:
* <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a> * <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a>
* <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a> * <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a>
@ -255,7 +255,7 @@ Flask-apispec був створений тими ж розробниками Mar
Використовувати типи Python, щоб мати чудову підтримку редактора. Використовувати типи Python, щоб мати чудову підтримку редактора.
Мати потужну систему впровадження залежностей. Знайдіть спосіб звести до мінімуму повторення коду. Мати потужну систему впровадження залежностей. Знайдіть спосіб звести до мінімуму повторення коду.
/// ///
@ -267,7 +267,7 @@ Flask-apispec був створений тими ж розробниками Mar
Він використовував <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким. Він використовував <a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a> замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким.
Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах. Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах.
/// ///
@ -275,7 +275,7 @@ Flask-apispec був створений тими ж розробниками Mar
Знайти спосіб отримати божевільну продуктивність. Знайти спосіб отримати божевільну продуктивність.
Ось чому **FastAPI** базується на Starlette, оскільки це найшвидша доступна структура (перевірена тестами сторонніх розробників). Ось чому **FastAPI** базується на Starlette, оскільки це найшвидша доступна структура (перевірена тестами сторонніх розробників).
/// ///
@ -291,9 +291,9 @@ Falcon — ще один високопродуктивний фреймворк
Знайти способи отримати чудову продуктивність. Знайти способи отримати чудову продуктивність.
Разом із Hug (оскільки Hug базується на Falcon) надихнув **FastAPI** оголосити параметр `response` у функціях. Разом із Hug (оскільки Hug базується на Falcon) надихнув **FastAPI** оголосити параметр `response` у функціях.
Хоча у FastAPI це необов’язково, і використовується в основному для встановлення заголовків, файлів cookie та альтернативних кодів стану. Хоча у FastAPI це необов’язково, і використовується в основному для встановлення заголовків, файлів cookie та альтернативних кодів статусу.
/// ///
@ -317,7 +317,7 @@ Falcon — ще один високопродуктивний фреймворк
Визначити додаткові перевірки для типів даних, використовуючи значення "за замовчуванням" атрибутів моделі. Це покращує підтримку редактора, а раніше вона була недоступна в Pydantic. Визначити додаткові перевірки для типів даних, використовуючи значення "за замовчуванням" атрибутів моделі. Це покращує підтримку редактора, а раніше вона була недоступна в Pydantic.
Це фактично надихнуло оновити частини Pydantic, щоб підтримувати той самий стиль оголошення перевірки (всі ці функції вже доступні в Pydantic). Це фактично надихнуло оновити частини Pydantic, щоб підтримувати той самий стиль оголошення перевірки (всі ці функції вже доступні в Pydantic).
/// ///
@ -341,13 +341,13 @@ Hug створив Тімоті Крослі, той самий творець <
/// ///
/// check | Надихнуло **FastAPI** на /// check | Ідеї, що надихнули **FastAPI**
Hug надихнув частину APIStar і був одним із найбільш перспективних інструментів, поряд із APIStar. Hug надихнув частину APIStar і був одним із найбільш перспективних інструментів, поряд із APIStar.
Hug надихнув **FastAPI** на використання підказок типу Python для оголошення параметрів і автоматичного створення схеми, що визначає API. Hug надихнув **FastAPI** на використання підказок типу Python для оголошення параметрів і автоматичного створення схеми, що визначає API.
Hug надихнув **FastAPI** оголосити параметр `response` у функціях для встановлення заголовків і файлів cookie. Hug надихнув **FastAPI** оголосити параметр `response` у функціях для встановлення заголовків і файлів cookie.
/// ///
@ -389,13 +389,13 @@ APIStar створив Том Крісті. Той самий хлопець, я
Існувати. Існувати.
Ідею оголошення кількох речей (перевірки даних, серіалізації та документації) за допомогою тих самих типів Python, які в той же час забезпечували чудову підтримку редактора, я вважав геніальною ідеєю. Ідею оголошення кількох речей (перевірки даних, серіалізації та документації) за допомогою тих самих типів Python, які в той же час забезпечували чудову підтримку редактора, я вважав геніальною ідеєю.
І після тривалого пошуку подібної структури та тестування багатьох різних альтернатив, APIStar став найкращим доступним варіантом. І після тривалого пошуку подібної структури та тестування багатьох різних альтернатив, APIStar став найкращим доступним варіантом.
Потім APIStar перестав існувати як сервер, і було створено Starlette, який став новою кращою основою для такої системи. Це стало останнім джерелом натхнення для створення **FastAPI**. Потім APIStar перестав існувати як сервер, і було створено Starlette, який став новою кращою основою для такої системи. Це стало останнім джерелом натхнення для створення **FastAPI**.
Я вважаю **FastAPI** «духовним спадкоємцем» APIStar, удосконалюючи та розширюючи функції, систему типізації та інші частини на основі досвіду, отриманого від усіх цих попередніх інструментів. Я вважаю **FastAPI** «духовним спадкоємцем» APIStar, удосконалюючи та розширюючи функції, систему типізації та інші частини на основі досвіду, отриманого від усіх цих попередніх інструментів.
/// ///
@ -403,7 +403,7 @@ APIStar створив Том Крісті. Той самий хлопець, я
### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic } ### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic }
Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою схеми JSON) на основі підказок типу Python. Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python.
Це робить його надзвичайно інтуїтивним. Це робить його надзвичайно інтуїтивним.
@ -411,15 +411,15 @@ Pydantic — це бібліотека для визначення переві
/// check | **FastAPI** використовує його для /// check | **FastAPI** використовує його для
Виконання перевірки всіх даних, серіалізації даних і автоматичної документацію моделі (на основі схеми JSON). Виконання перевірки всіх даних, серіалізації даних і автоматичної документації моделі (на основі Схеми JSON).
Потім **FastAPI** бере ці дані схеми JSON і розміщує їх у OpenAPI, окремо від усіх інших речей, які він робить. Потім **FastAPI** бере ці дані Схеми JSON і розміщує їх у OpenAPI, окремо від усіх інших речей, які він робить.
/// ///
### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette } ### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
Starlette — це легкий фреймворк/набір інструментів <abbr title="Новий стандарт для створення асинхронних Python вебзастосунків">ASGI</abbr>, який ідеально підходить для створення високопродуктивних asyncio сервісів. Starlette — це легкий фреймворк/набір інструментів <dfn title="Новий стандарт для створення асинхронних вебзастосунків на Python">ASGI</dfn>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
Він дуже простий та інтуїтивно зрозумілий. Його розроблено таким чином, щоб його можна було легко розширювати та мати модульні компоненти. Він дуже простий та інтуїтивно зрозумілий. Його розроблено таким чином, щоб його можна було легко розширювати та мати модульні компоненти.
@ -448,7 +448,7 @@ Starlette надає всі основні функції веб-мікрофр
ASGI — це новий «стандарт», який розробляється членами основної команди Django. Це ще не «стандарт Python» (PEP), хоча вони в процесі цього. ASGI — це новий «стандарт», який розробляється членами основної команди Django. Це ще не «стандарт Python» (PEP), хоча вони в процесі цього.
Тим не менш, він уже використовується як «стандарт» кількома інструментами. Це значно покращує сумісність, оскільки ви можете переключити Uvicorn на будь-який інший сервер ASGI (наприклад, Daphne або Hypercorn), або ви можете додати інструменти, сумісні з ASGI, як-от `python-socketio`. Тим не менш, він уже використовується як «стандарт» кількома інструментами. Це значно покращує сумісність, оскільки ви можете переключити Uvicorn на будь-який інший сервер ASGI (наприклад, Daphne або Hypercorn), або ви можете додати інструменти, сумісні з ASGI, як-от `python-socketio`.
/// ///
@ -456,9 +456,9 @@ ASGI — це новий «стандарт», який розробляєтьс
Керування всіма основними веб-частинами. Додавання функцій зверху. Керування всіма основними веб-частинами. Додавання функцій зверху.
Сам клас `FastAPI` безпосередньо успадковує клас `Starlette`. Сам клас `FastAPI` безпосередньо успадковує клас `Starlette`.
Отже, усе, що ви можете робити зі Starlette, ви можете робити це безпосередньо за допомогою **FastAPI**, оскільки це, по суті, Starlette на стероїдах. Отже, усе, що ви можете робити зі Starlette, ви можете робити це безпосередньо за допомогою **FastAPI**, оскільки це, по суті, Starlette на стероїдах.
/// ///
@ -474,9 +474,9 @@ Uvicorn — це блискавичний сервер ASGI, побудован
Основний веб-сервер для запуску програм **FastAPI**. Основний веб-сервер для запуску програм **FastAPI**.
Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер. Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер.
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}. Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}.
/// ///

View File

@ -6,7 +6,7 @@
### На основі відкритих стандартів { #based-on-open-standards } ### На основі відкритих стандартів { #based-on-open-standards }
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> для створення API, включаючи оголошення <abbr title="також відомі як: endpoints, маршрути">шляхів</abbr>, <abbr title="також відомі як HTTP-методи, наприклад, POST, GET, PUT, DELETE">операцій</abbr>, параметрів, тіл запитів, безпеки тощо. * <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> для створення API, включаючи оголошення <dfn title="також відомі як: кінцеві точки, маршрути">шляхів</dfn>, <dfn title="також відомі як методи HTTP, як-от POST, GET, PUT, DELETE">операцій</dfn>, параметрів, тіл запитів, безпеки тощо.
* Автоматична документація моделей даних за допомогою <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (оскільки OpenAPI базується саме на JSON Schema). * Автоматична документація моделей даних за допомогою <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (оскільки OpenAPI базується саме на JSON Schema).
* Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури. * Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури.
* Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами. * Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами.
@ -136,7 +136,7 @@ FastAPI має розумні **налаштування за замовчува
### Впровадження залежностей { #dependency-injection } ### Впровадження залежностей { #dependency-injection }
FastAPI містить надзвичайно просту у використанні, але надзвичайно потужну систему <abbr title='також відоме як: "components", "resources", "services", "providers"'><strong>Dependency Injection</strong></abbr>. FastAPI містить надзвичайно просту у використанні, але надзвичайно потужну систему <dfn title='також відоме як «components», «resources», «services», «providers»'><strong>Впровадження залежностей</strong></dfn>.
* Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**. * Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**.
* Усе **автоматично обробляється** фреймворком. * Усе **автоматично обробляється** фреймворком.
@ -153,8 +153,8 @@ FastAPI містить надзвичайно просту у використа
### Протестовано { #tested } ### Протестовано { #tested }
* 100% <abbr title="Обсяг коду, що автоматично тестується">покриття тестами</abbr>. * 100% <dfn title="Обсяг коду, що автоматично тестується">покриття тестами</dfn>.
* 100% <abbr title="Анотації типів у Python, завдяки яким ваш редактор і зовнішні інструменти можуть надавати кращу підтримку">анотована типами</abbr> кодова база. * 100% <dfn title="Анотації типів у Python, завдяки яким ваш редактор і зовнішні інструменти можуть надавати кращу підтримку">анотована типами</dfn> кодова база.
* Використовується в production-застосунках. * Використовується в production-застосунках.
## Можливості Starlette { #starlette-features } ## Можливості Starlette { #starlette-features }
@ -190,7 +190,7 @@ FastAPI містить надзвичайно просту у використа
* **Ніякої плутанини**: * **Ніякої плутанини**:
* Не потрібно вчити нову мікромову для визначення схем. * Не потрібно вчити нову мікромову для визначення схем.
* Якщо ви знаєте типи Python, ви знаєте, як використовувати Pydantic. * Якщо ви знаєте типи Python, ви знаєте, як використовувати Pydantic.
* Легко працює з вашим **<abbr title="Integrated Development Environment - Інтегроване середовище розробки: схоже на код-редактор">IDE</abbr>/<abbr title="Програма, що перевіряє код на помилки">linter</abbr>/мозком**: * Легко працює з вашим **<abbr title="Integrated Development Environment - Інтегроване середовище розробки: схоже на код-редактор">IDE</abbr>/<dfn title="Програма, що перевіряє код на помилки">linter</dfn>/мозком**:
* Оскільки структури даних pydantic є просто екземплярами класів, які ви визначаєте; автодоповнення, лінтинг, mypy і ваша інтуїція повинні добре працювати з вашими перевіреними даними. * Оскільки структури даних pydantic є просто екземплярами класів, які ви визначаєте; автодоповнення, лінтинг, mypy і ваша інтуїція повинні добре працювати з вашими перевіреними даними.
* Валідує **складні структури**: * Валідує **складні структури**:
* Використання ієрархічних моделей Pydantic, Python `typing`s `List` і `Dict` тощо. * Використання ієрархічних моделей Pydantic, Python `typing`s `List` і `Dict` тощо.

View File

@ -40,7 +40,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
* **Швидкий**: дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших Python-фреймворків](#performance). * **Швидкий**: дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших Python-фреймворків](#performance).
* **Швидке написання коду**: пришвидшує розробку функціоналу приблизно на 200%300%. * * **Швидке написання коду**: пришвидшує розробку функціоналу приблизно на 200%300%. *
* **Менше помилок**: зменшує приблизно на 40% кількість помилок, спричинених людиною (розробником). * * **Менше помилок**: зменшує приблизно на 40% кількість помилок, спричинених людиною (розробником). *
* **Інтуїтивний**: чудова підтримка редакторами коду. <abbr title="також відоме як auto-complete, autocompletion, IntelliSense">Автодоповнення</abbr> всюди. Менше часу на налагодження. * **Інтуїтивний**: чудова підтримка редакторами коду. <dfn title="також відоме як: авто-доповнення, автозавершення, IntelliSense">Автодоповнення</dfn> всюди. Менше часу на налагодження.
* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації. * **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок. * **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
* **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією. * **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією.
@ -127,7 +127,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a> <a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
Якщо ви створюєте застосунок <abbr title="Command Line Interface- Інтерфейс командного рядка">CLI</abbr> для використання в терміналі замість веб-API, зверніть увагу на <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>. Якщо ви створюєте застосунок <abbr title="Command Line Interface - Інтерфейс командного рядка">CLI</abbr> для використання в терміналі замість веб-API, зверніть увагу на <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>.
**Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀 **Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀
@ -368,7 +368,7 @@ item: Item
* Валідацію даних: * Валідацію даних:
* Автоматичні та зрозумілі помилки, коли дані некоректні. * Автоматичні та зрозумілі помилки, коли дані некоректні.
* Валідацію навіть для глибоко вкладених JSON-обʼєктів. * Валідацію навіть для глибоко вкладених JSON-обʼєктів.
* <abbr title="також відоме як serialization, parsing, marshalling">Перетворення</abbr> вхідних даних: з мережі до даних і типів Python. Читання з: * <dfn title="також відоме як: серіалізація, парсинг, маршалінг">Перетворення</dfn> вхідних даних: з мережі до даних і типів Python. Читання з:
* JSON. * JSON.
* Параметрів шляху. * Параметрів шляху.
* Параметрів запиту. * Параметрів запиту.
@ -376,7 +376,7 @@ item: Item
* Headers. * Headers.
* Forms. * Forms.
* Files. * Files.
* <abbr title="також відоме як serialization, parsing, marshalling">Перетворення</abbr> вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON): * <dfn title="також відоме як: серіалізація, парсинг, маршалінг">Перетворення</dfn> вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
* Перетворення типів Python (`str`, `int`, `float`, `bool`, `list`, тощо). * Перетворення типів Python (`str`, `int`, `float`, `bool`, `list`, тощо).
* Обʼєктів `datetime`. * Обʼєктів `datetime`.
* Обʼєктів `UUID`. * Обʼєктів `UUID`.
@ -439,7 +439,7 @@ item: Item
* Оголошення **параметрів** з інших різних місць, як-от: **headers**, **cookies**, **form fields** та **files**. * Оголошення **параметрів** з інших різних місць, як-от: **headers**, **cookies**, **form fields** та **files**.
* Як встановлювати **обмеження валідації** як `maximum_length` або `regex`. * Як встановлювати **обмеження валідації** як `maximum_length` або `regex`.
* Дуже потужну і просту у використанні систему **<abbr title="also known as components, resources, providers, services, injectables">Dependency Injection</abbr>**. * Дуже потужну і просту у використанні систему **<dfn title="також відоме як: компоненти, ресурси, провайдери, сервіси, інжектовані залежності">Впровадження залежностей</dfn>**.
* Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth. * Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth.
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic). * Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
* Інтеграцію **GraphQL** з <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> та іншими бібліотеками. * Інтеграцію **GraphQL** з <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> та іншими бібліотеками.
@ -524,7 +524,7 @@ FastAPI залежить від Pydantic і Starlette.
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - потрібно, якщо ви хочете використовувати `TestClient`. * <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - потрібно, якщо ви хочете використовувати `TestClient`.
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням. * <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням.
* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - потрібно, якщо ви хочете підтримувати <abbr title="перетворення строки із HTTP-запиту, у Python типи">«parsing»</abbr> форм за допомогою `request.form()`. * <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - потрібно, якщо ви хочете підтримувати форми з <dfn title="перетворення строки, що надходить із HTTP-запиту, у дані Python">«парсингом»</dfn> через `request.form()`.
Використовується FastAPI: Використовується FastAPI:

View File

@ -1,5 +1,5 @@
# Навчання { #learn } # Навчання { #learn }
У цьому розділі надані вступні розділи та навчальні матеріали для вивчення **FastAPI**. У цьому розділі надані вступні розділи та навчальні посібники для вивчення **FastAPI**.
Це можна розглядати як **книгу**, **курс**, або **офіційний** та рекомендований спосіб освоїти FastAPI. 😎 Це можна розглядати як **книгу**, **курс**, або **офіційний** та рекомендований спосіб освоїти FastAPI. 😎

View File

@ -2,11 +2,11 @@
Python підтримує додаткові «підказки типів» (також звані «анотаціями типів»). Python підтримує додаткові «підказки типів» (також звані «анотаціями типів»).
Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати <abbr title="наприклад: str, int, float, bool">тип</abbr> змінної. Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати <dfn title="наприклад: str, int, float, bool">тип</dfn> змінної.
За допомогою оголошення типів для ваших змінних редактори та інструменти можуть надати вам кращу підтримку. За допомогою оголошення типів для ваших змінних редактори та інструменти можуть надати вам кращу підтримку.
Це лише **швидкий туторіал / нагадування** про підказки типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **FastAPI**... що насправді дуже мало. Це лише **швидкий навчальний посібник / нагадування** про підказки типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **FastAPI**... що насправді дуже мало.
**FastAPI** повністю базується на цих підказках типів, вони дають йому багато переваг і користі. **FastAPI** повністю базується на цих підказках типів, вони дають йому багато переваг і користі.
@ -22,7 +22,7 @@ Python підтримує додаткові «підказки типів» (т
Давайте почнемо з простого прикладу: Давайте почнемо з простого прикладу:
{* ../../docs_src/python_types/tutorial001_py39.py *} {* ../../docs_src/python_types/tutorial001_py310.py *}
Виклик цієї програми виводить: Виклик цієї програми виводить:
@ -34,9 +34,9 @@ John Doe
* Бере `first_name` та `last_name`. * Бере `first_name` та `last_name`.
* Перетворює першу літеру кожного з них у верхній регістр за допомогою `title()`. * Перетворює першу літеру кожного з них у верхній регістр за допомогою `title()`.
* <abbr title="Об’єднує їх разом, як одне ціле. З вмістом один за одним.">Конкатенує</abbr> їх разом із пробілом по середині. * <dfn title="Об’єднує їх разом, як одне ціле. З вмістом одного після іншого.">Конкатенує</dfn> їх разом із пробілом по середині.
{* ../../docs_src/python_types/tutorial001_py39.py hl[2] *} {* ../../docs_src/python_types/tutorial001_py310.py hl[2] *}
### Редагуйте це { #edit-it } ### Редагуйте це { #edit-it }
@ -78,7 +78,7 @@ John Doe
Це «підказки типів»: Це «підказки типів»:
{* ../../docs_src/python_types/tutorial002_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial002_py310.py hl[1] *}
Це не те саме, що оголошення значень за замовчуванням, як це було б з: Це не те саме, що оголошення значень за замовчуванням, як це було б з:
@ -106,15 +106,15 @@ John Doe
Перевірте цю функцію, вона вже має підказки типів: Перевірте цю функцію, вона вже має підказки типів:
{* ../../docs_src/python_types/tutorial003_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial003_py310.py hl[1] *}
Оскільки редактор знає типи змінних, ви не тільки отримаєте автозаповнення, ви також отримаєте перевірку помилок: Оскільки редактор знає типи змінних, ви не тільки отримаєте автозаповнення, ви також отримаєте перевірку помилок:
<img src="/img/python-types/image04.png"> <img src="/img/python-types/image04.png">
Тепер ви знаєте, щоб виправити це, вам потрібно перетворити `age` у рядок за допомогою `str(age)`: Тепер ви знаєте, щоб виправити це, вам потрібно перетворити `age` у строку за допомогою `str(age)`:
{* ../../docs_src/python_types/tutorial004_py39.py hl[2] *} {* ../../docs_src/python_types/tutorial004_py310.py hl[2] *}
## Оголошення типів { #declaring-types } ## Оголошення типів { #declaring-types }
@ -133,29 +133,32 @@ John Doe
* `bool` * `bool`
* `bytes` * `bytes`
{* ../../docs_src/python_types/tutorial005_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial005_py310.py hl[1] *}
### Generic-типи з параметрами типів { #generic-types-with-type-parameters } ### Модуль `typing` { #typing-module }
Існують деякі структури даних, які можуть містити інші значення, наприклад `dict`, `list`, `set` та `tuple`. І внутрішні значення також можуть мати свій тип. Для деяких додаткових випадків використання може знадобитися імпортувати елементи зі стандартної бібліотеки, модуля `typing`. Наприклад, коли ви хочете оголосити, що щось має «будь-який тип», ви можете використати `Any` з `typing`:
Ці типи, які мають внутрішні типи, називаються «**generic**» типами. І оголосити їх можна навіть із внутрішніми типами. ```python
from typing import Any
Щоб оголосити ці типи та внутрішні типи, ви можете використовувати стандартний модуль Python `typing`. Він існує спеціально для підтримки цих підказок типів.
#### Новіші версії Python { #newer-versions-of-python } def some_function(data: Any):
print(data)
```
Синтаксис із використанням `typing` **сумісний** з усіма версіями, від Python 3.6 до останніх, включаючи Python 3.9, Python 3.10 тощо. ### Generic типи { #generic-types }
У міру розвитку Python **новіші версії** мають покращену підтримку цих анотацій типів і в багатьох випадках вам навіть не потрібно буде імпортувати та використовувати модуль `typing` для оголошення анотацій типів. Деякі типи можуть приймати «параметри типів» у квадратних дужках, щоб визначити їх внутрішні типи. Наприклад, «list строк» буде оголошений як `list[str]`.
Якщо ви можете вибрати новішу версію Python для свого проекту, ви зможете скористатися цією додатковою простотою. Ці типи, які можуть приймати параметри типів, називаються **generic типами** або **generics**.
У всій документації є приклади, сумісні з кожною версією Python (коли є різниця). Ви можете використовувати ті самі вбудовані типи як generics (з квадратними дужками та типами всередині):
Наприклад, «**Python 3.6+**» означає, що це сумісно з Python 3.6 або вище (включно з 3.7, 3.8, 3.9, 3.10 тощо). А «**Python 3.9+**» означає, що це сумісно з Python 3.9 або вище (включаючи 3.10 тощо). * `list`
* `tuple`
Якщо ви можете використовувати **останні версії Python**, використовуйте приклади для останньої версії — вони матимуть **найкращий і найпростіший синтаксис**, наприклад, «**Python 3.10+**». * `set`
* `dict`
#### List { #list } #### List { #list }
@ -167,7 +170,7 @@ John Doe
Оскільки список є типом, який містить деякі внутрішні типи, ви поміщаєте їх у квадратні дужки: Оскільки список є типом, який містить деякі внутрішні типи, ви поміщаєте їх у квадратні дужки:
{* ../../docs_src/python_types/tutorial006_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
/// info | Інформація /// info | Інформація
@ -193,7 +196,7 @@ John Doe
Ви повинні зробити те ж саме, щоб оголосити `tuple` і `set`: Ви повинні зробити те ж саме, щоб оголосити `tuple` і `set`:
{* ../../docs_src/python_types/tutorial007_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial007_py310.py hl[1] *}
Це означає: Це означає:
@ -208,56 +211,32 @@ John Doe
Другий параметр типу для значень у `dict`: Другий параметр типу для значень у `dict`:
{* ../../docs_src/python_types/tutorial008_py39.py hl[1] *} {* ../../docs_src/python_types/tutorial008_py310.py hl[1] *}
Це означає: Це означає:
* Змінна `prices` — це `dict`: * Змінна `prices` — це `dict`:
* Ключі цього `dict` мають тип `str` (скажімо, назва кожного елементу). * Ключі цього `dict` мають тип `str` (скажімо, назва кожного предмета).
* Значення цього `dict` мають тип `float` (скажімо, ціна кожного елементу). * Значення цього `dict` мають тип `float` (скажімо, ціна кожного предмета).
#### Union { #union } #### Union { #union }
Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад `int` або `str`. Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад `int` або `str`.
У Python 3.6 і вище (включаючи Python 3.10) ви можете використовувати тип `Union` з `typing` і вставляти в квадратні дужки можливі типи, які можна прийняти. Щоб визначити це, використовуйте <dfn title='також називають «побітовим оператором "або"», але це значення тут не актуальне'>вертикальну риску (`|`)</dfn>, щоб розділити обидва типи.
У Python 3.10 також є **новий синтаксис**, у якому ви можете розділити можливі типи за допомогою <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальної смуги (`|`)</abbr>. Це називається «union», тому що змінна може бути чимось із об’єднання цих двох множин типів.
//// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial008b_py310.py!} {!> ../../docs_src/python_types/tutorial008b_py310.py!}
``` ```
//// Це означає, що `item` може бути `int` або `str`.
//// tab | Python 3.9+
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial008b_py39.py!}
```
////
В обох випадках це означає, що `item` може бути `int` або `str`.
#### Можливо `None` { #possibly-none } #### Можливо `None` { #possibly-none }
Ви можете оголосити, що значення може мати тип, наприклад `str`, але також може бути `None`. Ви можете оголосити, що значення може мати тип, наприклад `str`, але також може бути `None`.
У Python 3.6 і вище (включаючи Python 3.10) ви можете оголосити його, імпортувавши та використовуючи `Optional` з модуля `typing`.
```Python hl_lines="1 4"
{!../../docs_src/python_types/tutorial009_py39.py!}
```
Використання `Optional[str]` замість просто `str` дозволить редактору допомогти вам виявити помилки, коли ви могли б вважати, що значенням завжди є `str`, хоча насправді воно також може бути `None`.
`Optional[Something]` насправді є скороченням для `Union[Something, None]`, вони еквівалентні.
Це також означає, що в Python 3.10 ви можете використовувати `Something | None`:
//// tab | Python 3.10+ //// tab | Python 3.10+
```Python hl_lines="1" ```Python hl_lines="1"
@ -266,96 +245,7 @@ John Doe
//// ////
//// tab | Python 3.9+ Використання `str | None` замість просто `str` дозволить редактору допомогти вам виявити помилки, коли ви могли б вважати, що значенням завжди є `str`, хоча насправді воно також може бути `None`.
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial009_py39.py!}
```
////
//// tab | Python 3.9+ alternative
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial009b_py39.py!}
```
////
#### Використання `Union` або `Optional` { #using-union-or-optional }
Якщо ви використовуєте версію Python нижче 3.10, ось порада з моєї дуже **суб’єктивної** точки зору:
* 🚨 Уникайте використання `Optional[SomeType]`
* Натомість ✨ **використовуйте `Union[SomeType, None]`** ✨.
Обидва варіанти еквівалентні й «під капотом» це одне й те саме, але я рекомендую `Union` замість `Optional`, тому що слово «**optional**» може створювати враження, ніби значення є необов’язковим, хоча насправді це означає «воно може бути `None`», навіть якщо воно не є необов’язковим і все одно є обов’язковим.
Я вважаю, що `Union[SomeType, None]` більш явно показує, що саме мається на увазі.
Це лише про слова й назви. Але ці слова можуть впливати на те, як ви та ваша команда думаєте про код.
Як приклад, розгляньмо цю функцію:
{* ../../docs_src/python_types/tutorial009c_py39.py hl[1,4] *}
Параметр `name` визначено як `Optional[str]`, але він **не є необов’язковим**, ви не можете викликати функцію без параметра:
```Python
say_hi() # Ой, ні, це викликає помилку! 😱
```
Параметр `name` **все ще є обов’язковим** (не *optional*), тому що він не має значення за замовчуванням. Водночас `name` приймає `None` як значення:
```Python
say_hi(name=None) # Це працює, None є валідним 🎉
```
Добра новина: щойно ви перейдете на Python 3.10, вам не доведеться про це хвилюватися, адже ви зможете просто використовувати `|` для визначення об’єднань типів:
{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
І тоді вам не доведеться хвилюватися про назви на кшталт `Optional` і `Union`. 😎
#### Generic типи { #generic-types }
Ці типи, які приймають параметри типу у квадратних дужках, називаються **Generic types** or **Generics**, наприклад:
//// tab | Python 3.10+
Ви можете використовувати ті самі вбудовані типи як generic (з квадратними дужками та типами всередині):
* `list`
* `tuple`
* `set`
* `dict`
І так само, як і в попередніх версіях Python, з модуля `typing`:
* `Union`
* `Optional`
* ...та інші.
У Python 3.10 як альтернативу використанню generic `Union` та `Optional` ви можете використовувати <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальну смугу (`|`)</abbr> для оголошення об’єднань типів — це значно краще й простіше.
////
//// tab | Python 3.9+
Ви можете використовувати ті самі вбудовані типи як generic (з квадратними дужками та типами всередині):
* `list`
* `tuple`
* `set`
* `dict`
І generic з модуля `typing`:
* `Union`
* `Optional`
* ...та інші.
////
### Класи як типи { #classes-as-types } ### Класи як типи { #classes-as-types }
@ -363,11 +253,11 @@ say_hi(name=None) # Це працює, None є валідним 🎉
Скажімо, у вас є клас `Person` з імʼям: Скажімо, у вас є клас `Person` з імʼям:
{* ../../docs_src/python_types/tutorial010_py39.py hl[1:3] *} {* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *}
Потім ви можете оголосити змінну типу `Person`: Потім ви можете оголосити змінну типу `Person`:
{* ../../docs_src/python_types/tutorial010_py39.py hl[6] *} {* ../../docs_src/python_types/tutorial010_py310.py hl[6] *}
І знову ж таки, ви отримуєте всю підтримку редактора: І знову ж таки, ви отримуєте всю підтримку редактора:
@ -401,21 +291,15 @@ say_hi(name=None) # Це працює, None є валідним 🎉
**FastAPI** повністю базується на Pydantic. **FastAPI** повністю базується на Pydantic.
Ви побачите набагато більше цього всього на практиці в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
/// tip | Порада
Pydantic має спеціальну поведінку, коли ви використовуєте `Optional` або `Union[Something, None]` без значення за замовчуванням; детальніше про це можна прочитати в документації Pydantic про <a href="https://docs.pydantic.dev/2.3/usage/models/#required-fields" class="external-link" target="_blank">Required Optional fields</a>.
///
## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations } ## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations }
У Python також є можливість додавати **додаткові <abbr title="Дані про дані, у цьому випадку — інформація про тип, наприклад опис.">метадані</abbr>** до цих підказок типів за допомогою `Annotated`. У Python також є можливість додавати **додаткові <dfn title="Дані про дані, у цьому випадку — інформація про тип, наприклад опис.">метадані</dfn>** до цих підказок типів за допомогою `Annotated`.
Починаючи з Python 3.9, `Annotated` є частиною стандартної бібліотеки, тож ви можете імпортувати його з `typing`. Ви можете імпортувати `Annotated` з `typing`.
{* ../../docs_src/python_types/tutorial013_py39.py hl[1,4] *} {* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *}
Сам Python нічого не робить із цим `Annotated`. А для редакторів та інших інструментів тип усе ще є `str`. Сам Python нічого не робить із цим `Annotated`. А для редакторів та інших інструментів тип усе ще є `str`.
@ -435,7 +319,7 @@ Pydantic має спеціальну поведінку, коли ви вико
/// ///
## Анотації типів у **FastAPI** { #type-hints-in-fastapi } ## Підказки типів у **FastAPI** { #type-hints-in-fastapi }
**FastAPI** використовує ці підказки типів для виконання кількох речей. **FastAPI** використовує ці підказки типів для виконання кількох речей.
@ -453,12 +337,12 @@ Pydantic має спеціальну поведінку, коли ви вико
* **Документування** API за допомогою OpenAPI: * **Документування** API за допомогою OpenAPI:
* який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів. * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас. Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас.
/// info | Інформація /// info | Інформація
Якщо ви вже пройшли весь туторіал і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">«шпаргалка» від `mypy`</a>. Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: <a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">«шпаргалка» від `mypy`</a>.
/// ///

View File

@ -1,6 +1,6 @@
# Фонові задачі { #background-tasks } # Фонові задачі { #background-tasks }
Ви можете створювати фонові задачі, які будуть виконуватися *після* повернення відповіді. Ви можете створювати фонові задачі, які будуть виконуватися після повернення відповіді.
Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді. Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді.
@ -13,9 +13,9 @@
## Використання `BackgroundTasks` { #using-backgroundtasks } ## Використання `BackgroundTasks` { #using-backgroundtasks }
Спочатку імпортуйте `BackgroundTasks` і оголосіть параметр у вашій *функції операції шляху* з анотацією типу `BackgroundTasks`: Спочатку імпортуйте `BackgroundTasks` і оголосіть параметр у вашій функції операції шляху з анотацією типу `BackgroundTasks`:
{* ../../docs_src/background_tasks/tutorial001_py39.py hl[1,13] *} {* ../../docs_src/background_tasks/tutorial001_py310.py hl[1,13] *}
**FastAPI** створить для вас об’єкт типу `BackgroundTasks` і передасть його як цей параметр. **FastAPI** створить для вас об’єкт типу `BackgroundTasks` і передасть його як цей параметр.
@ -31,13 +31,13 @@
І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`: І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`:
{* ../../docs_src/background_tasks/tutorial001_py39.py hl[6:9] *} {* ../../docs_src/background_tasks/tutorial001_py310.py hl[6:9] *}
## Додавання фонової задачі { #add-the-background-task } ## Додавання фонової задачі { #add-the-background-task }
Усередині вашої *функції операції шляху*, передайте функцію задачі в об'єкт *background tasks*, використовуючи метод `.add_task()`: Усередині вашої функції операції шляху, передайте функцію задачі в об'єкт background tasks, використовуючи метод `.add_task()`:
{* ../../docs_src/background_tasks/tutorial001_py39.py hl[14] *} {* ../../docs_src/background_tasks/tutorial001_py310.py hl[14] *}
`.add_task()` приймає аргументи: `.add_task()` приймає аргументи:
@ -47,17 +47,17 @@
## Впровадження залежностей { #dependency-injection } ## Впровадження залежностей { #dependency-injection }
Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у підзалежності тощо. Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у функції операції шляху, у залежності (залежний), у підзалежності тощо.
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту: **FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *} {* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
У цьому прикладі повідомлення будуть записані у файл `log.txt` *після* того, як відповідь буде надіслана. У цьому прикладі повідомлення будуть записані у файл `log.txt` після того, як відповідь буде надіслана.
Якщо у запиті був переданий query, він буде записаний у лог у фоновій задачі. Якщо у запиті був переданий параметр запиту, він буде записаний у лог у фоновій задачі.
А потім інша фонова задача, згенерована у *функції операції шляху*, запише повідомлення з використанням path параметра `email`. А потім інша фонова задача, згенерована у функції операції шляху, запише повідомлення з використанням параметра шляху `email`.
## Технічні деталі { #technical-details } ## Технічні деталі { #technical-details }
@ -65,7 +65,7 @@
Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`. Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`.
Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у *функції операції шляху*, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`. Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у функції операції шляху, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його. Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
@ -81,4 +81,4 @@
## Підсумок { #recap } ## Підсумок { #recap }
Імпортуйте та використовуйте `BackgroundTasks` як параметри у *функціях операції шляху* та залежностях, щоб додавати фонові задачі. Імпортуйте та використовуйте `BackgroundTasks` як параметри у функціях операції шляху та залежностях, щоб додавати фонові задачі.

View File

@ -18,7 +18,7 @@
## Декілька параметрів тіла { #multiple-body-parameters } ## Декілька параметрів тіла { #multiple-body-parameters }
У попередньому прикладі *операції шляху* очікували б JSON-тіло з атрибутами `Item`, наприклад: У попередньому прикладi *операції шляху* очікували б JSON-тіло з атрибутами `Item`, наприклад:
```JSON ```JSON
{ {
@ -106,13 +106,6 @@
q: str | None = None q: str | None = None
``` ```
Або в Python 3.9:
```Python
q: Union[str, None] = None
```
Наприклад: Наприклад:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *} {* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}

View File

@ -164,7 +164,7 @@ images: list[Image]
наприклад: наприклад:
{* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *} {* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *}
## Підтримка в редакторі всюди { #editor-support-everywhere } ## Підтримка в редакторі всюди { #editor-support-everywhere }
@ -194,7 +194,7 @@ images: list[Image]
У цьому випадку ви можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`: У цьому випадку ви можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *} {* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
/// tip | Порада /// tip | Порада
@ -216,6 +216,6 @@ images: list[Image]
* Підтримка в редакторі (автодоповнення всюди!) * Підтримка в редакторі (автодоповнення всюди!)
* Конвертація даних (парсинг/сериалізація) * Конвертація даних (парсинг/сериалізація)
* Валідацію даних * Валідація даних
* Документація схем * Документація схем
* Автоматичне створення документації * Автоматичне створення документації

View File

@ -8,7 +8,7 @@
Щоб оголосити тіло **запиту**, ви використовуєте <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> моделі з усією їх потужністю та перевагами. Щоб оголосити тіло **запиту**, ви використовуєте <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> моделі з усією їх потужністю та перевагами.
/// info | Інформація /// info
Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`. Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`.
@ -73,8 +73,8 @@
* Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними. * Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними.
* Надавати отримані дані у параметрі `item`. * Надавати отримані дані у параметрі `item`.
* Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів. * Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів.
* Генерувати <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> визначення для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту. * Генерувати визначення <a href="https://json-schema.org" class="external-link" target="_blank">Схеми JSON</a> для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту.
* Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією <abbr title="User Interfaces Інтерфейси користувача">UIs</abbr>. * Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією <abbr title="User Interfaces - Інтерфейси користувача">UIs</abbr>.
## Автоматична документація { #automatic-docs } ## Автоматична документація { #automatic-docs }
@ -108,7 +108,7 @@
<img src="/img/tutorial/body/image05.png"> <img src="/img/tutorial/body/image05.png">
/// tip | Порада /// tip
Якщо ви використовуєте <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> як ваш редактор, ви можете використати <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>. Якщо ви використовуєте <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> як ваш редактор, ви можете використати <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>.
@ -151,11 +151,11 @@
* Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**. * Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**.
* Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**. * Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**.
/// note | Примітка /// note
FastAPI буде знати, що значення `q` не є обов'язковим через значення за замовчуванням `= None`. FastAPI буде знати, що значення `q` не є обов'язковим через значення за замовчуванням `= None`.
`str | None` (Python 3.10+) або `Union` у `Union[str, None]` (Python 3.9+) FastAPI не використовує, щоб визначити, що значення не є обов’язковим він знатиме, що воно не є обов’язковим, тому що має значення за замовчуванням `= None`. `str | None` FastAPI не використовує, щоб визначити, що значення не є обов’язковим - він знатиме, що воно не є обов’язковим, тому що має значення за замовчуванням `= None`.
Але додавання анотацій типів дозволить вашому редактору надати вам кращу підтримку та виявляти помилки. Але додавання анотацій типів дозволить вашому редактору надати вам кращу підтримку та виявляти помилки.
@ -163,4 +163,4 @@ FastAPI буде знати, що значення `q` не є обов'язко
## Без Pydantic { #without-pydantic } ## Без Pydantic { #without-pydantic }
Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло - Кілька параметрів: Окремі значення в тілі](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.

View File

@ -1,8 +1,8 @@
# Моделі параметрів Cookie { #cookie-parameter-models } # Моделі параметрів Cookie { #cookie-parameter-models }
Якщо у Вас є група **cookies**, які пов'язані між собою, Ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪 Якщо у вас є група **cookies**, які пов'язані між собою, ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
Це дозволить Вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎 Це дозволить вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
/// note | Примітка /// note | Примітка
@ -18,11 +18,11 @@
## Cookie з Pydantic-моделлю { #cookies-with-a-pydantic-model } ## Cookie з Pydantic-моделлю { #cookies-with-a-pydantic-model }
Оголосіть **cookie**-параметри, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`: Оголосіть **cookie**-параметри, які вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} {* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
**FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати Вам Pydantic-модель, яку Ви визначили. **FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати вам Pydantic-модель, яку ви визначили.
## Перевірка у документації { #check-the-docs } ## Перевірка у документації { #check-the-docs }
@ -36,17 +36,17 @@
Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати. Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
Якщо Ви зайдете до **інтерфейсу документації API** за адресою `/docs`, Ви зможете побачити **документацію** для cookies у Ваших *операціях шляху*. Якщо ви зайдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies у ваших *операціях шляху*.
Але навіть якщо Ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і Ви побачите **помилку**, ніби Ви не ввели жодних значень. Але навіть якщо ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і ви побачите **помилку**, ніби ви не ввели жодних значень.
/// ///
## Заборона додаткових cookie { #forbid-extra-cookies } ## Заборона додаткових cookie { #forbid-extra-cookies }
У деяких спеціальних випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** cookies, які хочете отримувати. У деяких спеціальних випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** cookies, які хочете отримувати.
Ваша API тепер має можливість контролювати власну <abbr title="This is a joke, just in case. It has nothing to do with cookie consents, but it's funny that even the API can now reject the poor cookies. Have a cookie. 🍪">згоду на cookie</abbr>. 🤪🍪 Ваш API тепер має можливість контролювати власну <dfn title="Це жарт, про всяк випадок. Це не має стосунку до згоди на cookies, просто кумедно, що навіть API тепер може відхиляти бідні cookies. Візьміть печиво. 🍪">згоду на cookies</dfn>. 🤪🍪
Ви можете використовувати налаштування моделі Pydantic, щоб `forbid` будь-які `extra` поля: Ви можете використовувати налаштування моделі Pydantic, щоб `forbid` будь-які `extra` поля:
@ -54,9 +54,9 @@
Якщо клієнт спробує надіслати якісь **додаткові cookies**, він отримає відповідь з **помилкою**. Якщо клієнт спробує надіслати якісь **додаткові cookies**, він отримає відповідь з **помилкою**.
Бідні банери cookie, які так старанно намагаються отримати Вашу згоду, щоб <abbr title="This is another joke. Don't pay attention to me. Have some coffee for your cookie. ☕">API її відхилила</abbr>. 🍪 Бідні банери cookie, які так старанно намагаються отримати вашу згоду, щоб <dfn title="Це ще один жарт. Не звертайте на мене уваги. Випийте трохи кави до свого печива. ☕">API її відхилила</dfn>. 🍪
Наприклад, якщо клієнт спробує надіслати cookie `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з помилкою, яка повідомить, що `santa_tracker` <abbr title="Santa disapproves the lack of cookies. 🎅 Okay, no more cookie jokes.">cookie не дозволено</abbr>: Наприклад, якщо клієнт спробує надіслати cookie `santa_tracker` зі значенням `good-list-please`, він отримає відповідь з помилкою, яка повідомить, що `santa_tracker` <dfn title="Санта не схвалює нестачу cookies. 🎅 Гаразд, досить жартів про cookies.">cookie не дозволено</dfn>:
```json ```json
{ {
@ -73,4 +73,4 @@
## Підсумок { #summary } ## Підсумок { #summary }
Ви можете використовувати **Pydantic-моделі** для оголошення <abbr title="Have a last cookie before you go. 🍪">**cookies**</abbr> у **FastAPI**. 😎 Ви можете використовувати **Pydantic-моделі** для оголошення <dfn title="Візьміть останнє печиво перед тим, як підете. 🍪">**cookies**</dfn> у **FastAPI**. 😎

View File

@ -1,6 +1,6 @@
# Параметри Cookie { #cookie-parameters } # Параметри кукі { #cookie-parameters }
Ви можете визначати параметри Cookie таким же чином, як визначаються параметри `Query` і `Path`. Ви можете визначати параметри кукі таким же чином, як визначаються параметри `Query` і `Path`.
## Імпорт `Cookie` { #import-cookie } ## Імпорт `Cookie` { #import-cookie }
@ -10,7 +10,7 @@
## Визначення параметрів `Cookie` { #declare-cookie-parameters } ## Визначення параметрів `Cookie` { #declare-cookie-parameters }
Потім визначте параметри cookie, використовуючи таку ж конструкцію як для `Path` і `Query`. Потім визначте параметри кукі, використовуючи таку ж конструкцію як для `Path` і `Query`.
Ви можете визначити значення за замовчуванням, а також усі додаткові параметри валідації чи анотації: Ви можете визначити значення за замовчуванням, а також усі додаткові параметри валідації чи анотації:
@ -26,20 +26,20 @@
/// info /// info
Для визначення cookies ви маєте використовувати `Cookie`, тому що в іншому випадку параметри будуть інтерпритовані, як параметри запиту. Для визначення кукі ви маєте використовувати `Cookie`, тому що в іншому випадку параметри будуть інтерпретовані як параметри запиту.
/// ///
/// info /// info
Майте на увазі, що оскільки **браузери обробляють cookies** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними. Майте на увазі, що оскільки **браузери обробляють кукі** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними.
Якщо ви перейдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies для ваших *операцій шляху*. Якщо ви перейдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для кукі для ваших *операцій шляху*.
Але навіть якщо ви **заповните дані** і натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не буде надіслано, і ви побачите повідомлення про **помилку**, ніби ви не ввели жодних значень. Але навіть якщо ви **заповните дані** і натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, кукі не буде надіслано, і ви побачите повідомлення про **помилку**, ніби ви не ввели жодних значень.
/// ///
## Підсумки { #recap } ## Підсумки { #recap }
Визначайте cookies за допомогою `Cookie`, використовуючи той же спільний шаблон, що і `Query` та `Path`. Визначайте кукі за допомогою `Cookie`, використовуючи той же спільний шаблон, що і `Query` та `Path`.

View File

@ -1,6 +1,6 @@
# CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing } # CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing }
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS або "Cross-Origin Resource Sharing"</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому "джерелі" (origin). <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS або «Cross-Origin Resource Sharing»</a> є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin).
## Джерело (Origin) { #origin } ## Джерело (Origin) { #origin }
@ -13,50 +13,49 @@
* `https://localhost` * `https://localhost`
* `http://localhost:8080` * `http://localhost:8080`
Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими "джерелами". Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими «джерелами».
## Кроки { #steps } ## Кроки { #steps }
Припустимо, що Ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`). Припустимо, що ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`).
Потім браузер надішле HTTP-запит `OPTIONS` до бекенду на порту `:80`, і якщо бекенд надішле відповідні заголовки, що дозволяють комунікацію з цього іншого джерела (`http://localhost:8080`), тоді браузер на порту `:8080` дозволить JavaScript у фронтенді надіслати свій запит до бекенду на порту `:80`. Потім браузер надішле HTTP-запит `OPTIONS` до бекенду на порту `:80`, і якщо бекенд надішле відповідні заголовки, що дозволяють комунікацію з цього іншого джерела (`http://localhost:8080`), тоді браузер на порту `:8080` дозволить JavaScript у фронтенді надіслати свій запит до бекенду на порту `:80`.
Щоб досягти цього, бекенд на порту `:80` повинен мати список "дозволених джерел". Щоб досягти цього, бекенд на порту `:80` повинен мати список «дозволених джерел».
У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно. У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно.
## Символьне підставляння { #wildcards } ## Дикі карти { #wildcards }
Можна також оголосити список як `"*"` ("символьне підставляння"), що означає дозвіл для всіх джерел. Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел.
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer Tokens, тощо. Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо.
Тому для коректної роботи краще явно вказувати дозволені джерела. Тому для коректної роботи краще явно вказувати дозволені джерела.
## Використання `CORSMiddleware` { #use-corsmiddleware } ## Використання `CORSMiddleware` { #use-corsmiddleware }
Ви можете налаштувати це у Вашому додатку **FastAPI** за допомогою `CORSMiddleware`. Ви можете налаштувати це у вашому додатку **FastAPI** за допомогою `CORSMiddleware`.
* Імпортуйте `CORSMiddleware`. * Імпортуйте `CORSMiddleware`.
* Створіть список дозволених джерел (у вигляді рядків). * Створіть список дозволених джерел (у вигляді рядків).
* Додайте його як "middleware" у Ваш додаток **FastAPI**. * Додайте його як «проміжне програмне забезпечення» у ваш додаток **FastAPI**.
Також можна вказати, чи дозволяє ваш бекенд:
Також можна вказати, чи дозволяє Ваш бекенд:
* Облікові дані (заголовки авторизації, Cookies, тощо). * Облікові дані (заголовки авторизації, Cookies, тощо).
* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"` * Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
* Конкретні HTTP-заголовки або всі за допомогою `"*"`. * Конкретні HTTP-заголовки або всі за допомогою `"*"`.
{* ../../docs_src/cors/tutorial001_py39.py hl[2,6:11,13:19] *} {* ../../docs_src/cors/tutorial001_py310.py hl[2,6:11,13:19] *}
Параметри за замовчуванням у реалізації `CORSMiddleware` є досить обмеженими, тому Вам потрібно явно увімкнути конкретні джерела, методи або заголовки, щоб браузерам було дозволено використовувати їх у міждоменному контексті. Параметри за замовчуванням у реалізації `CORSMiddleware` є досить обмеженими, тому вам потрібно явно увімкнути конкретні джерела, методи або заголовки, щоб браузерам було дозволено використовувати їх у міждоменному контексті.
Підтримуються такі аргументи: Підтримуються такі аргументи:
* `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати `['*']`, щоб дозволити будь-яке джерело. * `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати `['*']`, щоб дозволити будь-яке джерело.
* `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`. * `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`.
* `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи. * `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи.
* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простих CORS-запитів</a>. * `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">простих CORS-запитів</a>.
@ -67,7 +66,7 @@
* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`. * `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`. * `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
Цей middleware обробляє два типи HTTP-запитів... Це проміжне програмне забезпечення обробляє два типи HTTP-запитів...
### Попередні CORS-запити { #cors-preflight-requests } ### Попередні CORS-запити { #cors-preflight-requests }
@ -81,7 +80,7 @@
## Додаткова інформація { #more-info } ## Додаткова інформація { #more-info }
Більше про <abbr title="Cross-Origin Resource Sharing">CORS</abbr> можна дізнатися в <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">документації Mozilla про CORS</a>. Більше про <abbr title="Cross-Origin Resource Sharing - Обмін ресурсами між різними джерелами">CORS</abbr> можна дізнатися в <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">документації Mozilla про CORS</a>.
/// note | Технічні деталі /// note | Технічні деталі

View File

@ -6,7 +6,7 @@
У вашому FastAPI-додатку імпортуйте та запустіть `uvicorn` безпосередньо: У вашому FastAPI-додатку імпортуйте та запустіть `uvicorn` безпосередньо:
{* ../../docs_src/debugging/tutorial001_py39.py hl[1,15] *} {* ../../docs_src/debugging/tutorial001_py310.py hl[1,15] *}
### Про `__name__ == "__main__"` { #about-name-main } ### Про `__name__ == "__main__"` { #about-name-main }

View File

@ -2,7 +2,7 @@
Найпростіший файл FastAPI може виглядати так: Найпростіший файл FastAPI може виглядати так:
{* ../../docs_src/first_steps/tutorial001_py39.py *} {* ../../docs_src/first_steps/tutorial001_py310.py *}
Скопіюйте це до файлу `main.py`. Скопіюйте це до файлу `main.py`.
@ -183,7 +183,7 @@ Deploying to FastAPI Cloud...
### Крок 1: імпортуємо `FastAPI` { #step-1-import-fastapi } ### Крок 1: імпортуємо `FastAPI` { #step-1-import-fastapi }
{* ../../docs_src/first_steps/tutorial001_py39.py hl[1] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *}
`FastAPI` — це клас у Python, який надає всю функціональність для вашого API. `FastAPI` — це клас у Python, який надає всю функціональність для вашого API.
@ -197,7 +197,7 @@ Deploying to FastAPI Cloud...
### Крок 2: створюємо «екземпляр» `FastAPI` { #step-2-create-a-fastapi-instance } ### Крок 2: створюємо «екземпляр» `FastAPI` { #step-2-create-a-fastapi-instance }
{* ../../docs_src/first_steps/tutorial001_py39.py hl[3] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *}
Тут змінна `app` буде «екземпляром» класу `FastAPI`. Тут змінна `app` буде «екземпляром» класу `FastAPI`.
@ -221,7 +221,7 @@ https://example.com/items/foo
/items/foo /items/foo
``` ```
/// info | Інформація /// info
«Шлях» також зазвичай називають «ендпоінтом» або «маршрутом». «Шлях» також зазвичай називають «ендпоінтом» або «маршрутом».
@ -266,12 +266,12 @@ https://example.com/items/foo
#### Визначте *декоратор операції шляху* { #define-a-path-operation-decorator } #### Визначте *декоратор операції шляху* { #define-a-path-operation-decorator }
{* ../../docs_src/first_steps/tutorial001_py39.py hl[6] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *}
Декоратор `@app.get("/")` повідомляє **FastAPI**, що функція одразу нижче відповідає за обробку запитів, які надходять до: Декоратор `@app.get("/")` повідомляє **FastAPI**, що функція одразу нижче відповідає за обробку запитів, які надходять до:
* шляху `/` * шляху `/`
* використовуючи <abbr title="an HTTP GET method"><code>get</code> операцію</abbr> * використовуючи <dfn title="HTTP метод GET"><code>get</code> операція</dfn>
/// info | `@decorator` Інформація /// info | `@decorator` Інформація
@ -300,7 +300,7 @@ https://example.com/items/foo
* `@app.patch()` * `@app.patch()`
* `@app.trace()` * `@app.trace()`
/// tip | Порада /// tip
Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте. Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте.
@ -320,7 +320,7 @@ https://example.com/items/foo
* **операція**: це `get`. * **операція**: це `get`.
* **функція**: це функція нижче «декоратора» (нижче `@app.get("/")`). * **функція**: це функція нижче «декоратора» (нижче `@app.get("/")`).
{* ../../docs_src/first_steps/tutorial001_py39.py hl[7] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[7] *}
Це функція Python. Це функція Python.
@ -332,9 +332,9 @@ https://example.com/items/foo
Ви також можете визначити її як звичайну функцію замість `async def`: Ви також можете визначити її як звичайну функцію замість `async def`:
{* ../../docs_src/first_steps/tutorial003_py39.py hl[7] *} {* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
/// note | Примітка /// note
Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry){.internal-link target=_blank}. Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry){.internal-link target=_blank}.
@ -342,7 +342,7 @@ https://example.com/items/foo
### Крок 5: поверніть вміст { #step-5-return-the-content } ### Крок 5: поверніть вміст { #step-5-return-the-content }
{* ../../docs_src/first_steps/tutorial001_py39.py hl[8] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[8] *}
Ви можете повернути `dict`, `list`, а також окремі значення `str`, `int` тощо. Ви можете повернути `dict`, `list`, а також окремі значення `str`, `int` тощо.

View File

@ -25,7 +25,7 @@
### Імпорт `HTTPException` { #import-httpexception } ### Імпорт `HTTPException` { #import-httpexception }
{* ../../docs_src/handling_errors/tutorial001_py39.py hl[1] *} {* ../../docs_src/handling_errors/tutorial001_py310.py hl[1] *}
### Згенеруйте `HTTPException` у своєму коді { #raise-an-httpexception-in-your-code } ### Згенеруйте `HTTPException` у своєму коді { #raise-an-httpexception-in-your-code }
@ -39,7 +39,7 @@
У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`: У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`:
{* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *} {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
### Отримана відповідь { #the-resulting-response } ### Отримана відповідь { #the-resulting-response }
@ -77,7 +77,7 @@
Але якщо вам знадобиться це для складного сценарію, ви можете додати власні заголовки: Але якщо вам знадобиться це для складного сценарію, ви можете додати власні заголовки:
{* ../../docs_src/handling_errors/tutorial002_py39.py hl[14] *} {* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *}
## Встановлення власних обробників виключень { #install-custom-exception-handlers } ## Встановлення власних обробників виключень { #install-custom-exception-handlers }
@ -89,7 +89,7 @@
Ви можете додати власний обробник виключень за допомогою `@app.exception_handler()`: Ви можете додати власний обробник виключень за допомогою `@app.exception_handler()`:
{* ../../docs_src/handling_errors/tutorial003_py39.py hl[5:7,13:18,24] *} {* ../../docs_src/handling_errors/tutorial003_py310.py hl[5:7,13:18,24] *}
Тут, якщо ви звернетеся до `/unicorns/yolo`, *операція шляху* згенерує (`raise`) `UnicornException`. Тут, якщо ви звернетеся до `/unicorns/yolo`, *операція шляху* згенерує (`raise`) `UnicornException`.
@ -127,7 +127,7 @@
Обробник виключень отримає `Request` і саме виключення. Обробник виключень отримає `Request` і саме виключення.
{* ../../docs_src/handling_errors/tutorial004_py39.py hl[2,14:19] *} {* ../../docs_src/handling_errors/tutorial004_py310.py hl[2,14:19] *}
Тепер, якщо ви перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку: Тепер, якщо ви перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку:
@ -159,7 +159,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
Наприклад, ви можете захотіти повернути відповідь у вигляді простого тексту замість JSON для цих помилок: Наприклад, ви можете захотіти повернути відповідь у вигляді простого тексту замість JSON для цих помилок:
{* ../../docs_src/handling_errors/tutorial004_py39.py hl[3:4,9:11,25] *} {* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *}
/// note | Технічні деталі /// note | Технічні деталі
@ -183,7 +183,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
Ви можете використовувати це під час розробки свого додатка, щоб логувати тіло запиту та налагоджувати його, повертати користувачеві тощо. Ви можете використовувати це під час розробки свого додатка, щоб логувати тіло запиту та налагоджувати його, повертати користувачеві тощо.
{* ../../docs_src/handling_errors/tutorial005_py39.py hl[14] *} {* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *}
Тепер спробуйте надіслати некоректний елемент, наприклад: Тепер спробуйте надіслати некоректний елемент, наприклад:
@ -239,6 +239,6 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
Якщо ви хочете використовувати виключення разом із такими ж обробниками виключень за замовчуванням, як у **FastAPI**, ви можете імпортувати та повторно використати обробники виключень за замовчуванням із `fastapi.exception_handlers`: Якщо ви хочете використовувати виключення разом із такими ж обробниками виключень за замовчуванням, як у **FastAPI**, ви можете імпортувати та повторно використати обробники виключень за замовчуванням із `fastapi.exception_handlers`:
{* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *} {* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
У цьому прикладі ви просто друкуєте помилку з дуже виразним повідомленням, але ви зрозуміли основну ідею. Ви можете використовувати виключення, а потім просто повторно використати обробники виключень за замовчуванням. У цьому прикладі ви просто друкуєте помилку з дуже виразним повідомленням, але ви зрозуміли основну ідею. Ви можете використовувати виключення, а потім просто повторно використати обробники виключень за замовчуванням.

View File

@ -1,8 +1,8 @@
# Моделі параметрів заголовків { #header-parameter-models } # Моделі параметрів заголовків { #header-parameter-models }
Якщо у Вас є група пов’язаних **параметрів заголовків**, Ви можете створити **Pydantic модель** для їх оголошення. Якщо у вас є група пов’язаних **параметрів заголовків**, ви можете створити **Pydantic модель** для їх оголошення.
Це дозволить Вам повторно **використовувати модель** в **різних місцях**, а також оголосити валідації та метадані для всіх параметрів одночасно. 😎 Це дозволить вам повторно **використовувати модель** в **різних місцях**, а також оголосити валідації та метадані для всіх параметрів одночасно. 😎
/// note | Примітка /// note | Примітка
@ -16,7 +16,7 @@
{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} {* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
**FastAPI** буде **витягувати** дані для **кожного поля** з **заголовків** у запиті та передавати їх у створену Вами Pydantic модель. **FastAPI** буде **витягувати** дані для **кожного поля** з **заголовків** у запиті та передавати їх у створену вами Pydantic модель.
## Перевірка в документації { #check-the-docs } ## Перевірка в документації { #check-the-docs }
@ -28,7 +28,7 @@
## Заборонити додаткові заголовки { #forbid-extra-headers } ## Заборонити додаткові заголовки { #forbid-extra-headers }
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** заголовки, які хочете отримати. У деяких особливих випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** заголовки, які хочете отримати.
Ви можете використати конфігурацію моделі Pydantic, щоб `заборонити` будь-які `додаткові` поля: Ви можете використати конфігурацію моделі Pydantic, щоб `заборонити` будь-які `додаткові` поля:
@ -55,9 +55,9 @@
Так само, як і зі звичайними параметрами заголовків, коли у назвах параметрів є символи підкреслення, вони **автоматично перетворюються на дефіси**. Так само, як і зі звичайними параметрами заголовків, коли у назвах параметрів є символи підкреслення, вони **автоматично перетворюються на дефіси**.
Наприклад, якщо у коді у Вас є параметр заголовка `save_data`, очікуваний HTTP-заголовок буде `save-data`, і він так само відображатиметься в документації. Наприклад, якщо у коді у вас є параметр заголовка `save_data`, очікуваний HTTP-заголовок буде `save-data`, і він так само відображатиметься в документації.
Якщо з якоїсь причини Вам потрібно вимкнути це автоматичне перетворення, Ви також можете зробити це для Pydantic моделей для параметрів заголовків. Якщо з якоїсь причини вам потрібно вимкнути це автоматичне перетворення, ви також можете зробити це для Pydantic моделей для параметрів заголовків.
{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} {* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *}

View File

@ -50,7 +50,7 @@
/// warning | Попередження /// warning | Попередження
Перед тим як встановити `convert_underscores` в `False`, пам’ятайте, що деякі HTTP-проксі та сервери забороняють використання заголовків із підкресленнями. Перед тим як встановити `convert_underscores` в `False`, пам’ятайте, що деякі HTTP-представники та сервери забороняють використання заголовків із підкресленнями.
/// ///

View File

@ -84,12 +84,12 @@ $ pip install "fastapi[standard]"
/// ///
## Розширений посібник користувача { #advanced-user-guide } ## Просунутий посібник користувача { #advanced-user-guide }
Існує також **Розширений посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**. Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**.
**Розширений посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям. **Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям.
Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте). Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте).
Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Розширеного посібника користувача**. Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**.

View File

@ -18,7 +18,7 @@
Ви можете налаштувати їх наступним чином: Ви можете налаштувати їх наступним чином:
{* ../../docs_src/metadata/tutorial001_py39.py hl[3:16, 19:32] *} {* ../../docs_src/metadata/tutorial001_py310.py hl[3:16, 19:32] *}
/// tip | Порада /// tip | Порада
@ -36,7 +36,7 @@
Наприклад: Наприклад:
{* ../../docs_src/metadata/tutorial001_1_py39.py hl[31] *} {* ../../docs_src/metadata/tutorial001_1_py310.py hl[31] *}
## Метадані для тегів { #metadata-for-tags } ## Метадані для тегів { #metadata-for-tags }
@ -58,7 +58,7 @@
Створіть метадані для своїх тегів і передайте їх у параметр `openapi_tags`: Створіть метадані для своїх тегів і передайте їх у параметр `openapi_tags`:
{* ../../docs_src/metadata/tutorial004_py39.py hl[3:16,18] *} {* ../../docs_src/metadata/tutorial004_py310.py hl[3:16,18] *}
Зверніть увагу, що в описах можна використовувати Markdown, наприклад, "login" буде показано жирним шрифтом (**login**), а "fancy" буде показано курсивом (_fancy_). Зверніть увагу, що в описах можна використовувати Markdown, наприклад, "login" буде показано жирним шрифтом (**login**), а "fancy" буде показано курсивом (_fancy_).
@ -72,7 +72,7 @@
Використовуйте параметр `tags` зі своїми *операціями шляху* (і `APIRouter`s), щоб призначити їх до різних тегів: Використовуйте параметр `tags` зі своїми *операціями шляху* (і `APIRouter`s), щоб призначити їх до різних тегів:
{* ../../docs_src/metadata/tutorial004_py39.py hl[21,26] *} {* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
/// info | Інформація /// info | Інформація
@ -100,7 +100,7 @@
Наприклад, щоб налаштувати його на `/api/v1/openapi.json`: Наприклад, щоб налаштувати його на `/api/v1/openapi.json`:
{* ../../docs_src/metadata/tutorial002_py39.py hl[3] *} {* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують. Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
@ -117,4 +117,4 @@
Наприклад, щоб налаштувати Swagger UI на `/documentation` і вимкнути ReDoc: Наприклад, щоб налаштувати Swagger UI на `/documentation` і вимкнути ReDoc:
{* ../../docs_src/metadata/tutorial003_py39.py hl[3] *} {* ../../docs_src/metadata/tutorial003_py310.py hl[3] *}

View File

@ -31,9 +31,9 @@
* Потім вона поверне `response`, згенеровану відповідною *операцією шляху*. * Потім вона поверне `response`, згенеровану відповідною *операцією шляху*.
* Потім ви можете додатково змінити `response` перед тим, як повернути її. * Потім ви можете додатково змінити `response` перед тим, як повернути її.
{* ../../docs_src/middleware/tutorial001_py39.py hl[8:9,11,14] *} {* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *}
/// tip | Порада /// tip
Пам’ятайте, що власні пропрієтарні заголовки можна додавати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">використовуючи префікс `X-`</a>. Пам’ятайте, що власні пропрієтарні заголовки можна додавати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">використовуючи префікс `X-`</a>.
@ -57,9 +57,9 @@
Наприклад, ви можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді: Наприклад, ви можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді:
{* ../../docs_src/middleware/tutorial001_py39.py hl[10,12:13] *} {* ../../docs_src/middleware/tutorial001_py310.py hl[10,12:13] *}
/// tip | Порада /// tip
Тут ми використовуємо <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 Тут ми використовуємо <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓
@ -92,4 +92,4 @@ app.add_middleware(MiddlewareB)
Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}.
Ви дізнаєтесь, як обробляти <abbr title="Cross-Origin Resource Sharing">CORS</abbr> за допомогою middleware в наступному розділі. Ви дізнаєтесь, як обробляти <abbr title="Cross-Origin Resource Sharing - Спільне використання ресурсів між джерелами">CORS</abbr> за допомогою middleware в наступному розділі.

View File

@ -54,11 +54,11 @@ Python видасть помилку, якщо розмістити значен
Тому ви можете оголосити вашу функцію так: Тому ви можете оголосити вашу функцію так:
{* ../../docs_src/path_params_numeric_validations/tutorial002_py39.py hl[7] *} {* ../../docs_src/path_params_numeric_validations/tutorial002_py310.py hl[7] *}
Але майте на увазі, що якщо ви використовуєте `Annotated`, цієї проблеми не буде, це не матиме значення, оскільки ви не використовуєте значення за замовчуванням параметрів функції для `Query()` або `Path()`. Але майте на увазі, що якщо ви використовуєте `Annotated`, цієї проблеми не буде, це не матиме значення, оскільки ви не використовуєте значення за замовчуванням параметрів функції для `Query()` або `Path()`.
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *} {* ../../docs_src/path_params_numeric_validations/tutorial002_an_py310.py *}
## Упорядковуйте параметри, як вам потрібно: хитрощі { #order-the-parameters-as-you-need-tricks } ## Упорядковуйте параметри, як вам потрібно: хитрощі { #order-the-parameters-as-you-need-tricks }
@ -81,15 +81,15 @@ Python видасть помилку, якщо розмістити значен
Передайте `*` як перший параметр функції. Передайте `*` як перший параметр функції.
Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Навіть якщо вони не мають значення за замовчуванням. Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як <abbr title="Походить від: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Навіть якщо вони не мають значення за замовчуванням.
{* ../../docs_src/path_params_numeric_validations/tutorial003_py39.py hl[7] *} {* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
### Краще з `Annotated` { #better-with-annotated } ### Краще з `Annotated` { #better-with-annotated }
Майте на увазі, що якщо ви використовуєте `Annotated`, оскільки ви не використовуєте значення за замовчуванням параметрів функції, цієї проблеми не буде, і, ймовірно, вам не потрібно буде використовувати `*`. Майте на увазі, що якщо ви використовуєте `Annotated`, оскільки ви не використовуєте значення за замовчуванням параметрів функції, цієї проблеми не буде, і, ймовірно, вам не потрібно буде використовувати `*`.
{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *} {* ../../docs_src/path_params_numeric_validations/tutorial003_an_py310.py hl[10] *}
## Валідація числових даних: більше або дорівнює { #number-validations-greater-than-or-equal } ## Валідація числових даних: більше або дорівнює { #number-validations-greater-than-or-equal }
@ -97,7 +97,7 @@ Python нічого не зробить із цією `*`, але розпізн
Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`. Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`.
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *} {* ../../docs_src/path_params_numeric_validations/tutorial004_an_py310.py hl[10] *}
## Валідація числових даних: більше ніж і менше або дорівнює { #number-validations-greater-than-and-less-than-or-equal } ## Валідація числових даних: більше ніж і менше або дорівнює { #number-validations-greater-than-and-less-than-or-equal }
@ -106,19 +106,19 @@ Python нічого не зробить із цією `*`, але розпізн
* `gt`: `g`reater `t`han * `gt`: `g`reater `t`han
* `le`: `l`ess than or `e`qual * `le`: `l`ess than or `e`qual
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *} {* ../../docs_src/path_params_numeric_validations/tutorial005_an_py310.py hl[10] *}
## Валідація числових даних: float, більше ніж і менше ніж { #number-validations-floats-greater-than-and-less-than } ## Валідація числових даних: float, більше ніж і менше ніж { #number-validations-floats-greater-than-and-less-than }
Валідація чисел також працює для значень типу `float`. Валідація чисел також працює для значень типу `float`.
Ось де стає важливо мати можливість оголошувати <abbr title="greater than"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`. Ось де стає важливо мати можливість оголошувати <abbr title="greater than - більше ніж"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal - більше або дорівнює"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні. Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні.
Те саме стосується <abbr title="less than"><code>lt</code></abbr>. Те саме стосується <abbr title="less than - менше ніж"><code>lt</code></abbr>.
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *} {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}
## Підсумок { #recap } ## Підсумок { #recap }

View File

@ -2,7 +2,7 @@
Ви можете оголосити «параметри» або «змінні» шляху, використовуючи той самий синтаксис, що й у форматованих рядках Python: Ви можете оголосити «параметри» або «змінні» шляху, використовуючи той самий синтаксис, що й у форматованих рядках Python:
{* ../../docs_src/path_params/tutorial001_py39.py hl[6:7] *} {* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *}
Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`. Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`.
@ -16,17 +16,17 @@
Ви можете оголосити тип параметра шляху у функції, використовуючи стандартні анотації типів Python: Ви можете оголосити тип параметра шляху у функції, використовуючи стандартні анотації типів Python:
{* ../../docs_src/path_params/tutorial002_py39.py hl[7] *} {* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
У цьому випадку `item_id` оголошено як `int`. У цьому випадку `item_id` оголошено як `int`.
/// check | Примітка /// check | Перевірте
Це дасть вам підтримку редактора всередині функції з перевірками помилок, автодоповненням тощо. Це дасть вам підтримку редактора всередині функції з перевірками помилок, автодоповненням тощо.
/// ///
## <abbr title="also known as: serialization, parsing, marshalling також відомо як: серіалізація, парсинг, маршалізація">Перетворення</abbr> даних { #data-conversion } ## <dfn title="також відомо як: серіалізація, парсинг, маршалізація">Перетворення</dfn> даних { #data-conversion }
Якщо ви запустите цей приклад і відкриєте у браузері <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, то побачите відповідь: Якщо ви запустите цей приклад і відкриєте у браузері <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, то побачите відповідь:
@ -34,11 +34,11 @@
{"item_id":3} {"item_id":3}
``` ```
/// check | Примітка /// check | Перевірте
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`, як Python `int`, а не рядок `"3"`. Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`, як Python `int`, а не рядок `"3"`.
Отже, з таким оголошенням типу **FastAPI** надає вам автоматичний <abbr title="converting the string that comes from an HTTP request into Python data перетворення рядка, що надходить із HTTP-запиту, у дані Python">«parsing»</abbr> запиту. Отже, з таким оголошенням типу **FastAPI** надає вам автоматичний запит <dfn title="перетворення рядка, що надходить із HTTP-запиту, у дані Python">«парсинг»</dfn>.
/// ///
@ -66,7 +66,7 @@
Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a> Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
/// check | Примітка /// check | Перевірте
Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних. Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних.
@ -82,7 +82,7 @@
<img src="/img/tutorial/path-params/image01.png"> <img src="/img/tutorial/path-params/image01.png">
/// check | Примітка /// check | Перевірте
Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI). Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
@ -118,19 +118,19 @@
Оскільки *операції шляху* оцінюються по черзі, вам потрібно переконатися, що шлях для `/users/me` оголошено перед шляхом для `/users/{user_id}`: Оскільки *операції шляху* оцінюються по черзі, вам потрібно переконатися, що шлях для `/users/me` оголошено перед шляхом для `/users/{user_id}`:
{* ../../docs_src/path_params/tutorial003_py39.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *}
Інакше шлях для `/users/{user_id}` також відповідатиме `/users/me`, «вважаючи», що отримує параметр `user_id` зі значенням `"me"`. Інакше шлях для `/users/{user_id}` також відповідатиме `/users/me`, «вважаючи», що отримує параметр `user_id` зі значенням `"me"`.
Так само ви не можете перевизначити операцію шляху: Так само ви не можете перевизначити операцію шляху:
{* ../../docs_src/path_params/tutorial003b_py39.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
Завжди використовуватиметься перша, оскільки шлях збігається першим. Завжди використовуватиметься перша, оскільки шлях збігається першим.
## Попередньо визначені значення { #predefined-values } ## Попередньо визначені значення { #predefined-values }
Якщо у вас є *операція шляху*, яка отримує *параметр шляху*, але ви хочете, щоб можливі коректні значення *параметра шляху* були попередньо визначені, ви можете використати стандартний Python <abbr title="Enumeration">`Enum`</abbr>. Якщо у вас є *операція шляху*, яка отримує *параметр шляху*, але ви хочете, щоб можливі коректні значення *параметра шляху* були попередньо визначені, ви можете використати стандартний Python <abbr title="Enumeration - Перелік">`Enum`</abbr>.
### Створіть клас `Enum` { #create-an-enum-class } ### Створіть клас `Enum` { #create-an-enum-class }
@ -140,11 +140,11 @@
Після цього створіть атрибути класу з фіксованими значеннями, які будуть доступними коректними значеннями: Після цього створіть атрибути класу з фіксованими значеннями, які будуть доступними коректними значеннями:
{* ../../docs_src/path_params/tutorial005_py39.py hl[1,6:9] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *}
/// tip | Порада /// tip | Порада
Якщо вам цікаво, «AlexNet», «ResNet» та «LeNet» — це просто назви Machine Learning <abbr title="Technically, Deep Learning model architectures технічно, архітектури моделей Deep Learning">models</abbr>. Якщо вам цікаво, «AlexNet», «ResNet» та «LeNet» — це просто назви моделей машинного навчання <dfn title="Технічно, архітектури моделей глибокого навчання">моделі</dfn>.
/// ///
@ -152,7 +152,7 @@
Потім створіть *параметр шляху* з анотацією типу, використовуючи створений вами клас enum (`ModelName`): Потім створіть *параметр шляху* з анотацією типу, використовуючи створений вами клас enum (`ModelName`):
{* ../../docs_src/path_params/tutorial005_py39.py hl[16] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
### Перевірте документацію { #check-the-docs } ### Перевірте документацію { #check-the-docs }
@ -168,13 +168,13 @@
Ви можете порівнювати його з *елементом перелічування* у створеному вами enum `ModelName`: Ви можете порівнювати його з *елементом перелічування* у створеному вами enum `ModelName`:
{* ../../docs_src/path_params/tutorial005_py39.py hl[17] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
#### Отримайте *значення перелічування* { #get-the-enumeration-value } #### Отримайте *значення перелічування* { #get-the-enumeration-value }
Ви можете отримати фактичне значення (у цьому випадку це `str`), використовуючи `model_name.value`, або загалом `your_enum_member.value`: Ви можете отримати фактичне значення (у цьому випадку це `str`), використовуючи `model_name.value`, або загалом `your_enum_member.value`:
{* ../../docs_src/path_params/tutorial005_py39.py hl[20] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[20] *}
/// tip | Порада /// tip | Порада
@ -188,7 +188,7 @@
Вони будуть перетворені на відповідні значення (у цьому випадку рядки) перед поверненням клієнту: Вони будуть перетворені на відповідні значення (у цьому випадку рядки) перед поверненням клієнту:
{* ../../docs_src/path_params/tutorial005_py39.py hl[18,21,23] *} {* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
На стороні клієнта ви отримаєте відповідь у форматі JSON, наприклад: На стороні клієнта ви отримаєте відповідь у форматі JSON, наприклад:
@ -227,7 +227,7 @@ OpenAPI не підтримує спосіб оголошення *параме
Отже, ви можете використати його так: Отже, ви можете використати його так:
{* ../../docs_src/path_params/tutorial004_py39.py hl[6] *} {* ../../docs_src/path_params/tutorial004_py310.py hl[6] *}
/// tip | Порада /// tip | Порада
@ -242,7 +242,7 @@ OpenAPI не підтримує спосіб оголошення *параме
З **FastAPI**, використовуючи короткі, інтуїтивно зрозумілі та стандартні оголошення типів Python, ви отримуєте: З **FastAPI**, використовуючи короткі, інтуїтивно зрозумілі та стандартні оголошення типів Python, ви отримуєте:
* Підтримку редактора: перевірка помилок, автодоповнення тощо. * Підтримку редактора: перевірка помилок, автодоповнення тощо.
* Перетворення даних «<abbr title="converting the string that comes from an HTTP request into Python data перетворення рядка, що надходить з HTTP-запиту, у дані Python">parsing</abbr>» * Перетворення даних «<dfn title="перетворення рядка, що надходить з HTTP-запиту, у дані Python">парсинг</dfn>»
* Валідацію даних * Валідацію даних
* Анотацію API та автоматичну документацію * Анотацію API та автоматичну документацію

View File

@ -1,6 +1,6 @@
# Моделі параметрів запиту { #query-parameter-models } # Моделі параметрів запиту { #query-parameter-models }
Якщо у Вас є група **query параметрів**, які пов’язані між собою, Ви можете створити **Pydantic-модель** для їх оголошення. Якщо у Вас є група **параметрів запиту**, які пов’язані між собою, Ви можете створити **Pydantic-модель** для їх оголошення.
Це дозволить Вам **повторно використовувати модель** у **різних місцях**, а також оголошувати перевірки та метадані для всіх параметрів одночасно. 😎 Це дозволить Вам **повторно використовувати модель** у **різних місцях**, а також оголошувати перевірки та метадані для всіх параметрів одночасно. 😎
@ -10,13 +10,13 @@
/// ///
## Query параметри з Pydantic-моделлю { #query-parameters-with-a-pydantic-model } ## Параметри запиту з Pydantic-моделлю { #query-parameters-with-a-pydantic-model }
Оголосіть **query параметри**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть цей параметр як `Query`: Оголосіть **параметри запиту**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть цей параметр як `Query`:
{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *} {* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *}
**FastAPI** буде **витягувати** дані для **кожного поля** з **query параметрів** у запиті та передавати їх у визначену вами Pydantic-модель. **FastAPI** буде **витягувати** дані для **кожного поля** з **параметрів запиту** у запиті та передавати їх у визначену вами Pydantic-модель.
## Перевірте документацію { #check-the-docs } ## Перевірте документацію { #check-the-docs }
@ -26,23 +26,23 @@
<img src="/img/tutorial/query-param-models/image01.png"> <img src="/img/tutorial/query-param-models/image01.png">
</div> </div>
## Заборона зайвих Query параметрів { #forbid-extra-query-parameters } ## Заборона зайвих параметрів запиту { #forbid-extra-query-parameters }
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** query параметри, які дозволено отримувати. У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** параметри запиту, які дозволено отримувати.
Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які зайві (`extra`) поля: Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які зайві (`extra`) поля:
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *} {* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку** відповідь. Якщо клієнт спробує надіслати **зайві** дані у **параметрах запиту**, він отримає **відповідь з помилкою**.
Наприклад, якщо клієнт спробує надіслати query параметр `tool` зі значенням `plumbus`, як у цьому запиті: Наприклад, якщо клієнт спробує надіслати параметр запиту `tool` зі значенням `plumbus`, як у цьому запиті:
```http ```http
https://example.com/items/?limit=10&tool=plumbus https://example.com/items/?limit=10&tool=plumbus
``` ```
Він отримає відповідь з **помилкою**, яка повідомить, що query параметр `tool ` не дозволено: Він отримає відповідь з **помилкою**, яка повідомить, що параметр запиту `tool` не дозволено:
```json ```json
{ {
@ -59,10 +59,10 @@ https://example.com/items/?limit=10&tool=plumbus
## Підсумок { #summary } ## Підсумок { #summary }
Ви можете використовувати **Pydantic-моделі** для оголошення **query параметрів** у **FastAPI**. 😎 Ви можете використовувати **Pydantic-моделі** для оголошення **параметрів запиту** у **FastAPI**. 😎
/// tip | Порада /// tip | Порада
Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення cookie та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫 Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення кукі та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
/// ///

View File

@ -18,7 +18,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
## Додаткова валідація { #additional-validation } ## Додаткова валідація { #additional-validation }
Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, **його довжина не перевищувала 50 символів**. Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, його довжина не перевищувала 50 символів.
### Імпорт `Query` та `Annotated` { #import-query-and-annotated } ### Імпорт `Query` та `Annotated` { #import-query-and-annotated }
@ -47,40 +47,16 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
Раніше ми мали таку анотацію типу: Раніше ми мали таку анотацію типу:
//// tab | Python 3.10+
```Python ```Python
q: str | None = None q: str | None = None
``` ```
////
//// tab | Python 3.9+
```Python
q: Union[str, None] = None
```
////
Тепер ми загорнемо її у `Annotated`, і отримаємо: Тепер ми загорнемо її у `Annotated`, і отримаємо:
//// tab | Python 3.10+
```Python ```Python
q: Annotated[str | None] = None q: Annotated[str | None] = None
``` ```
////
//// tab | Python 3.9+
```Python
q: Annotated[Union[str, None]] = None
```
////
Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`. Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
А тепер переходимо до цікавого! 🎉 А тепер переходимо до цікавого! 🎉
@ -93,23 +69,23 @@ q: Annotated[Union[str, None]] = None
Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим. Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим.
Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо **додаткову валідацію** для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎 Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо додаткову валідацію для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
/// tip | Порада /// tip | Порада
Тут ми використовуємо `Query()`, оскільки це **query параметр**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`. Тут ми використовуємо `Query()`, оскільки це query параметр. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
/// ///
Тепер FastAPI: Тепер FastAPI:
* **Перевірить** дані, щоб переконатися, що їхня максимальна довжина — 50 символів * Перевірить дані, щоб переконатися, що їхня максимальна довжина — 50 символів
* Покажe **чітку помилку** клієнту, якщо дані недійсні * Покажe чітку помилку клієнту, якщо дані недійсні
* **Задокументує** параметр в OpenAPI-схемі *операції шляху* (що відобразиться в **автоматично згенерованій документації**) * Задокументує параметр в OpenAPI-схемі операції шляху (що відобразиться в автоматично згенерованій документації)
## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value } ## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value }
У попередніх версіях FastAPI (до <abbr title="before 2023-03 до 2023-03">0.95.0</abbr>) потрібно було використовувати `Query` як значення за замовчуванням параметра, замість того, щоб додавати його в `Annotated`. Є висока ймовірність, що ви зустрінете код із таким підходом, тож я поясню його. У попередніх версіях FastAPI (до <dfn title="до 2023-03">0.95.0</dfn>) потрібно було використовувати `Query` як значення за замовчуванням параметра, замість того, щоб додавати його в `Annotated`. Є висока ймовірність, що ви зустрінете код із таким підходом, тож я поясню його.
/// tip | Порада /// tip | Порада
@ -131,7 +107,6 @@ q: str | None = Query(default=None)
...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно: ...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно:
```Python ```Python
q: str | None = None q: str | None = None
``` ```
@ -144,7 +119,7 @@ q: str | None = None
q: str | None = Query(default=None, max_length=50) q: str | None = Query(default=None, max_length=50)
``` ```
Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI *операції шляху*. Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI операції шляху.
### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated } ### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated }
@ -174,13 +149,13 @@ q: str = Query(default="rick")
### Переваги використання `Annotated` { #advantages-of-annotated } ### Переваги використання `Annotated` { #advantages-of-annotated }
**Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓 Використання `Annotated` є рекомендованим замість задання значення за замовчуванням у параметрах функції, оскільки воно краще з кількох причин. 🤓
Значення **за замовчуванням** параметра **функції** є **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌 Значення за замовчуванням параметра функції є фактичним значенням за замовчуванням, що є більш інтуїтивним у Python загалом. 😌
Ви можете **викликати** ту саму функцію **в інших місцях** без FastAPI, і вона **працюватиме очікувано**. Якщо параметр є **обов’язковим** (без значення за замовчуванням), ваш **редактор** повідомить про помилку, а **Python** також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра. Ви можете викликати ту саму функцію в інших місцях без FastAPI, і вона працюватиме очікувано. Якщо параметр є обов’язковим (без значення за замовчуванням), ваш редактор повідомить про помилку, а Python також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра.
Якщо ви не використовуєте `Annotated`, а використовуєте **(старий) стиль значень за замовчуванням**, то при виклику цієї функції без FastAPI **в інших місцях**, потрібно **пам’ятати** передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою. Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a>. 🚀 Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a>. 🚀
@ -192,7 +167,7 @@ q: str = Query(default="rick")
## Додавання регулярних виразів { #add-regular-expressions } ## Додавання регулярних виразів { #add-regular-expressions }
Ви можете визначити <abbr title="A regular expression, regex or regexp is a sequence of characters that define a search pattern for strings. Регулярний вираз (regex або regexp) — це послідовність символів, яка визначає шаблон для пошуку в рядках.">regular expression</abbr> `pattern`, якому має відповідати параметр: Ви можете визначити <dfn title="Регулярний вираз, regex або regexp — це послідовність символів, яка визначає шаблон для пошуку в рядках.">регулярний вираз</dfn> `pattern`, якому має відповідати параметр:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@ -212,7 +187,7 @@ q: str = Query(default="rick")
Припустімо, що ви хочете оголосити query параметр `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`: Припустімо, що ви хочете оголосити query параметр `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *} {* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *}
/// note | Примітка /// note | Примітка
@ -242,7 +217,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
Тому, якщо вам потрібно оголосити значення як обов’язкове під час використання `Query`, просто не вказуйте значення за замовчуванням: Тому, якщо вам потрібно оголосити значення як обов’язкове під час використання `Query`, просто не вказуйте значення за замовчуванням:
{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *} {* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
### Обов’язковий, може бути `None` { #required-can-be-none } ### Обов’язковий, може бути `None` { #required-can-be-none }
@ -266,7 +241,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
http://localhost:8000/items/?q=foo&q=bar http://localhost:8000/items/?q=foo&q=bar
``` ```
ви отримаєте кілька значень `q` *query параметрів* (`foo` і `bar`) у вигляді Python `list` у вашій *функції операції шляху*, у *параметрі функції* `q`. ви отримаєте кілька значень `q` query параметрів (`foo` і `bar`) у вигляді Python `list` у вашій функції операції шляху, у параметрі функції `q`.
Отже, відповідь на цей URL буде: Отже, відповідь на цей URL буде:
@ -293,7 +268,7 @@ http://localhost:8000/items/?q=foo&q=bar
Ви також можете визначити значення за замовчуванням `list`, якщо жодне значення не було передане: Ви також можете визначити значення за замовчуванням `list`, якщо жодне значення не було передане:
{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *} {* ../../docs_src/query_params_str_validations/tutorial012_an_py310.py hl[9] *}
Якщо ви перейдете за посиланням: Якщо ви перейдете за посиланням:
@ -316,7 +291,7 @@ http://localhost:8000/items/
Ви також можете використовувати `list` напряму замість `list[str]`: Ви також можете використовувати `list` напряму замість `list[str]`:
{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *} {* ../../docs_src/query_params_str_validations/tutorial013_an_py310.py hl[9] *}
/// note | Примітка /// note | Примітка
@ -372,7 +347,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
Припустімо, що вам більше не подобається цей параметр. Припустімо, що вам більше не подобається цей параметр.
Вам потрібно залишити його на деякий час, оскільки ним користуються клієнти, але ви хочете, щоб документація чітко показувала, що він є <abbr title="obsolete, recommended not to use it застарілий, не рекомендується до використання">deprecated</abbr>. Вам потрібно залишити його на деякий час, оскільки ним користуються клієнти, але ви хочете, щоб документація чітко показувала, що він є <dfn title="застарілий, не рекомендується до використання">застарілий</dfn>.
Тоді передайте параметр `deprecated=True` до `Query`: Тоді передайте параметр `deprecated=True` до `Query`:
@ -390,9 +365,9 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
## Кастомна валідація { #custom-validation } ## Кастомна валідація { #custom-validation }
Можуть бути випадки, коли вам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище. Можуть бути випадки, коли вам потрібно провести кастомну валідацію, яку не можна реалізувати за допомогою параметрів, показаних вище.
У таких випадках ви можете використати **кастомну функцію-валідатор**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`). У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
Це можна досягти за допомогою <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">Pydantic's `AfterValidator`</a> в середині `Annotated`. Це можна досягти за допомогою <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">Pydantic's `AfterValidator`</a> в середині `Annotated`.
@ -402,7 +377,7 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
/// ///
Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги <abbr title="ISBN means International Standard Book Number ISBN означає Міжнародний стандартний номер книги">ISBN</abbr> або з `imdb-` для ID URL фільму на <abbr title="IMDB (Internet Movie Database) is a website with information about movies IMDB (Internet Movie Database) це вебсайт з інформацією про фільми">IMDB</abbr>: Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги <abbr title="International Standard Book Number - Міжнародний стандартний номер книги">ISBN</abbr> або з `imdb-` для ID URL фільму на <abbr title="Internet Movie Database - Інтернетна база даних фільмів: вебсайт з інформацією про фільми">IMDB</abbr>:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
@ -414,15 +389,15 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
/// tip | Порада /// tip | Порада
Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким **зовнішнім компонентом**, таким як база даних чи інший API, замість цього слід використовувати **FastAPI Dependencies** — ви дізнаєтесь про них пізніше. Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким зовнішнім компонентом, таким як база даних чи інший API, замість цього слід використовувати FastAPI Dependencies — ви дізнаєтесь про них пізніше.
Ці кастомні валідатори використовуються для речей, які можна перевірити лише з **тіими самими даними**, що надані в запиті. Ці кастомні валідатори використовуються для речей, які можна перевірити лише з тими самими даними, що надані в запиті.
/// ///
### Зрозумійте цей код { #understand-that-code } ### Зрозумійте цей код { #understand-that-code }
Головний момент — це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸 Головний момент — це використання `AfterValidator` з функцією всередині `Annotated`. Можете пропустити цю частину, якщо хочете. 🤸
--- ---
@ -436,17 +411,17 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
#### Випадковий елемент { #a-random-item } #### Випадковий елемент { #a-random-item }
За допомогою `data.items()` ми отримуємо <abbr title="Something we can iterate on with a for loop, like a list, set, etc. Об'єкт, який можна перебирати в циклі, як-от список чи множину.">iterable object</abbr> із кортежами, що містять ключ і значення для кожного елемента словника. За допомогою `data.items()` ми отримуємо <dfn title="Щось, що ми можемо ітерувати циклом for, як-от список, множина тощо.">ітерабельний об'єкт</dfn> із кортежами, що містять ключ і значення для кожного елемента словника.
Ми перетворюємо цей iterable object у звичайний `list` за допомогою `list(data.items())`. Ми перетворюємо цей ітерабельний об'єкт у звичайний `list` за допомогою `list(data.items())`.
Потім, використовуючи `random.choice()`, ми можемо отримати **випадкове значення** зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`. Потім, використовуючи `random.choice()`, ми можемо отримати випадкове значення зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
Далі ми **присвоюємо ці два значення** кортежу змінним `id` і `name`. Далі ми присвоюємо ці два значення кортежу змінним `id` і `name`.
Тож, якщо користувач не вказав ID елемента, він все одно отримає випадкову рекомендацію. Тож, якщо користувач не вказав ID елемента, він все одно отримає випадкову рекомендацію.
...ми робимо все це в **одному простому рядку**. 🤯 Хіба ви не любите Python? 🐍 ...ми робимо все це в одному простому рядку. 🤯 Хіба ви не любите Python? 🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}

View File

@ -2,7 +2,7 @@
Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «query». Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «query».
{* ../../docs_src/query_params/tutorial001_py39.py hl[9] *} {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`. Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
@ -24,7 +24,7 @@ http://127.0.0.1:8000/items/?skip=0&limit=10
Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів query: Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів query:
* Підтримка в редакторі (очевидно) * Підтримка в редакторі (очевидно)
* <abbr title="converting the string that comes from an HTTP request into Python data перетворення рядка, що надходить з HTTP-запиту, у дані Python">«parsing»</abbr> даних * <dfn title="перетворення рядка, що надходить з HTTP-запиту, у дані Python">«парсинг»</dfn> даних
* Валідація даних * Валідація даних
* Автоматична документація * Автоматична документація
@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
У цьому випадку параметр функції `q` буде необов’язковим і за замовчуванням матиме значення `None`. У цьому випадку параметр функції `q` буде необов’язковим і за замовчуванням матиме значення `None`.
/// check | Примітка /// check | Перевірте
Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query. Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
@ -128,7 +128,7 @@ http://127.0.0.1:8000/items/foo?short=yes
Але якщо ви хочете зробити параметр query обов’язковим, просто не вказуйте для нього значення за замовчуванням: Але якщо ви хочете зробити параметр query обов’язковим, просто не вказуйте для нього значення за замовчуванням:
{* ../../docs_src/query_params/tutorial005_py39.py hl[6:7] *} {* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
Тут параметр query `needy` — обов’язковий параметр query типу `str`. Тут параметр query `needy` — обов’язковий параметр query типу `str`.
@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
/// tip | Порада /// tip | Порада
Ви також можете використовувати `Enum` так само, як і з [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}. Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values){.internal-link target=_blank}.
/// ///

View File

@ -20,13 +20,13 @@ $ pip install python-multipart
Імпортуйте `File` та `UploadFile` з `fastapi`: Імпортуйте `File` та `UploadFile` з `fastapi`:
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[3] *} {* ../../docs_src/request_files/tutorial001_an_py310.py hl[3] *}
## Визначення параметрів `File` { #define-file-parameters } ## Визначення параметрів `File` { #define-file-parameters }
Створіть параметри файлів так само як ви б створювали `Body` або `Form`: Створіть параметри файлів так само як ви б створювали `Body` або `Form`:
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *} {* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
/// info | Інформація /// info | Інформація
@ -54,7 +54,7 @@ $ pip install python-multipart
Визначте параметр файлу з типом `UploadFile`: Визначте параметр файлу з типом `UploadFile`:
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[14] *} {* ../../docs_src/request_files/tutorial001_an_py310.py hl[14] *}
Використання `UploadFile` має кілька переваг перед `bytes`: Використання `UploadFile` має кілька переваг перед `bytes`:
@ -121,7 +121,7 @@ contents = myfile.file.read()
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла. Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла.
Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> web docs для <code>POST</code></a>. Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> web docs для <code>POST</code></a>.
/// ///
@ -143,7 +143,7 @@ contents = myfile.file.read()
Ви також можете використовувати `File()` разом із `UploadFile`, наприклад, щоб встановити додаткові метадані: Ви також можете використовувати `File()` разом із `UploadFile`, наприклад, щоб встановити додаткові метадані:
{* ../../docs_src/request_files/tutorial001_03_an_py39.py hl[9,15] *} {* ../../docs_src/request_files/tutorial001_03_an_py310.py hl[9,15] *}
## Завантаження кількох файлів { #multiple-file-uploads } ## Завантаження кількох файлів { #multiple-file-uploads }
@ -153,7 +153,7 @@ contents = myfile.file.read()
Щоб це реалізувати, потрібно оголосити список `bytes` або `UploadFile`: Щоб це реалізувати, потрібно оголосити список `bytes` або `UploadFile`:
{* ../../docs_src/request_files/tutorial002_an_py39.py hl[10,15] *} {* ../../docs_src/request_files/tutorial002_an_py310.py hl[10,15] *}
Ви отримаєте, як і було оголошено, `list` із `bytes` або `UploadFile`. Ви отримаєте, як і було оголошено, `list` із `bytes` або `UploadFile`.
@ -169,7 +169,7 @@ contents = myfile.file.read()
Так само як і раніше, ви можете використовувати `File()`, щоб встановити додаткові параметри навіть для `UploadFile`: Так само як і раніше, ви можете використовувати `File()`, щоб встановити додаткові параметри навіть для `UploadFile`:
{* ../../docs_src/request_files/tutorial003_an_py39.py hl[11,18:20] *} {* ../../docs_src/request_files/tutorial003_an_py310.py hl[11,18:20] *}
## Підсумок { #recap } ## Підсумок { #recap }

View File

@ -24,7 +24,7 @@ $ pip install python-multipart
Вам просто потрібно оголосити **Pydantic-модель** з полями, які ви хочете отримати як **поля форми**, а потім оголосити параметр як `Form`: Вам просто потрібно оголосити **Pydantic-модель** з полями, які ви хочете отримати як **поля форми**, а потім оголосити параметр як `Form`:
{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *} {* ../../docs_src/request_form_models/tutorial001_an_py310.py hl[9:11,15] *}
**FastAPI** **витягне** дані для **кожного поля** з **формових даних** у запиті та надасть вам Pydantic-модель, яку ви визначили. **FastAPI** **витягне** дані для **кожного поля** з **формових даних** у запиті та надасть вам Pydantic-модель, яку ви визначили.
@ -48,7 +48,7 @@ $ pip install python-multipart
Ви можете використати конфігурацію Pydantic-моделі, щоб заборонити `forbid` будь-які додаткові `extra` поля: Ви можете використати конфігурацію Pydantic-моделі, щоб заборонити `forbid` будь-які додаткові `extra` поля:
{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *} {* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *}
Якщо клієнт спробує надіслати додаткові дані, він отримає **відповідь з помилкою**. Якщо клієнт спробує надіслати додаткові дані, він отримає **відповідь з помилкою**.

View File

@ -6,7 +6,7 @@
Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>. Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
Переконайтеся, що Ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили бібліотеку, наприклад: Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили бібліотеку, наприклад:
```console ```console
$ pip install python-multipart $ pip install python-multipart
@ -16,15 +16,15 @@ $ pip install python-multipart
## Імпорт `File` та `Form` { #import-file-and-form } ## Імпорт `File` та `Form` { #import-file-and-form }
{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[3] *} {* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[3] *}
## Оголошення параметрів `File` та `Form` { #define-file-and-form-parameters } ## Оголошення параметрів `File` та `Form` { #define-file-and-form-parameters }
Створіть параметри файлів та форми так само як і для `Body` або `Query`: Створіть параметри файлів та форми так само як і для `Body` або `Query`:
{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[10:12] *} {* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[10:12] *}
Файли та поля форми будуть завантажені як формові дані, і Ви отримаєте файли та поля форми. Файли та поля форми будуть завантажені як формові дані, і ви отримаєте файли та поля форми.
Ви також можете оголосити деякі файли як `bytes`, а деякі як `UploadFile`. Ви також можете оголосити деякі файли як `bytes`, а деякі як `UploadFile`.

View File

@ -1,6 +1,6 @@
# Дані форми { #form-data } # Дані форми { #form-data }
Якщо вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`. Коли вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`.
/// info | Інформація /// info | Інформація
@ -18,17 +18,17 @@ $ pip install python-multipart
Імпортуйте `Form` з `fastapi`: Імпортуйте `Form` з `fastapi`:
{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[3] *} {* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *}
## Оголошення параметрів `Form` { #define-form-parameters } ## Оголошення параметрів `Form` { #define-form-parameters }
Створюйте параметри форми так само як ви б створювали `Body` або `Query`: Створюйте параметри форми так само як ви б створювали `Body` або `Query`:
{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[9] *} {* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
Наприклад, один зі способів використання специфікації OAuth2 (так званий "password flow") вимагає надсилати `username` та `password` як поля форми. Наприклад, один зі способів використання специфікації OAuth2 (так званий «password flow») вимагає надсилати `username` та `password` як поля форми.
<abbr title="specification">spec</abbr> вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON. <dfn title="специфікація">специфікація</dfn> вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON.
З `Form` ви можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо. З `Form` ви можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо.
@ -44,19 +44,19 @@ $ pip install python-multipart
/// ///
## Про "поля форми" { #about-form-fields } ## Про «поля форми» { #about-form-fields }
HTML-форми (`<form></form>`) надсилають дані на сервер у "спеціальному" кодуванні, яке відрізняється від JSON. HTML-форми (`<form></form>`) надсилають дані на сервер у «спеціальному» кодуванні, яке відрізняється від JSON.
**FastAPI** подбає про те, щоб зчитати ці дані з правильного місця, а не з JSON. **FastAPI** подбає про те, щоб зчитати ці дані з правильного місця, а не з JSON.
/// note | Технічні деталі /// note | Технічні деталі
Дані з форм зазвичай кодуються за допомогою "типу медіа" `application/x-www-form-urlencoded`. Дані з форм зазвичай кодуються за допомогою «типу медіа» `application/x-www-form-urlencoded`.
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі. Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі.
Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> вебдокументації для <code>POST</code></a>. Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> вебдокументації для <code>POST</code></a>.
/// ///

View File

@ -81,7 +81,7 @@ FastAPI використовуватиме цей `response_model` для вик
$ pip install email-validator $ pip install email-validator
``` ```
or with: або так:
```console ```console
$ pip install "pydantic[email]" $ pip install "pydantic[email]"
@ -183,7 +183,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}. Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}.
{* ../../docs_src/response_model/tutorial003_02_py39.py hl[8,10:11] *} {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
Цей простий випадок автоматично обробляється FastAPI, тому що анотація типу повернення — це клас (або підклас) `Response`. Цей простий випадок автоматично обробляється FastAPI, тому що анотація типу повернення — це клас (або підклас) `Response`.
@ -193,7 +193,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
Ви також можете використати підклас `Response` в анотації типу: Ви також можете використати підклас `Response` в анотації типу:
{* ../../docs_src/response_model/tutorial003_03_py39.py hl[8:9] *} {* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *}
Це теж працюватиме, бо `RedirectResponse` — підклас `Response`, і FastAPI автоматично обробить цей простий випадок. Це теж працюватиме, бо `RedirectResponse` — підклас `Response`, і FastAPI автоматично обробить цей простий випадок.
@ -201,7 +201,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
Але коли ви повертаєте якийсь інший довільний об’єкт, що не є валідним типом Pydantic (наприклад, об’єкт бази даних), і анотуєте його так у функції, FastAPI спробує створити модель відповіді Pydantic на основі цієї анотації типу і це завершиться помилкою. Але коли ви повертаєте якийсь інший довільний об’єкт, що не є валідним типом Pydantic (наприклад, об’єкт бази даних), і анотуєте його так у функції, FastAPI спробує створити модель відповіді Pydantic на основі цієї анотації типу і це завершиться помилкою.
Те саме станеться, якщо ви використаєте <abbr title='Об’єднання (union) між кількома типами означає «будь-який із цих типів».'>union</abbr> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥: Те саме станеться, якщо у вас буде <dfn title="об'єднання між кількома типами означає «будь-який із цих типів»">об'єднання</dfn> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *} {* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}

View File

@ -8,7 +8,7 @@
* `@app.delete()` * `@app.delete()`
* тощо. * тощо.
{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *} {* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
/// note | Примітка /// note | Примітка
@ -66,7 +66,7 @@ FastAPI знає про це і створить документацію OpenAP
/// tip | Порада /// tip | Порада
Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте документацію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> про HTTP коди статусу</a>. Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте документацію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Мережа Розробників Mozilla">MDN</abbr> про HTTP коди статусу</a>.
/// ///
@ -74,7 +74,7 @@ FastAPI знає про це і створить документацію OpenAP
Розглянемо попередній приклад ще раз: Розглянемо попередній приклад ще раз:
{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *} {* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
`201` — це код статусу для «Created». `201` — це код статусу для «Created».
@ -82,7 +82,7 @@ FastAPI знає про це і створить документацію OpenAP
Ви можете використовувати зручні змінні з `fastapi.status`. Ви можете використовувати зручні змінні з `fastapi.status`.
{* ../../docs_src/response_status_code/tutorial002_py39.py hl[1,6] *} {* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
Вони — просто для зручності, містять те саме число, але так ви можете скористатися автозаповненням редактора, щоб знайти їх: Вони — просто для зручності, містять те саме число, але так ви можете скористатися автозаповненням редактора, щоб знайти їх:

View File

@ -40,7 +40,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} {* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
## `examples` у JSON-схемі OpenAPI { #examples-in-json-schema-openapi } ## `examples` у JSON-схемі - OpenAPI { #examples-in-json-schema-openapi }
При використанні будь-кого з наступного: При використанні будь-кого з наступного:
@ -74,7 +74,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних тіла. Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних тіла.
Втім, на момент написання цього (<abbr title="2023-08-26">час написання цього</abbr>), Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів для даних у **JSON-схемі**. Але нижче можна прочитати про обхідний шлях. Втім, на <dfn title="2023-08-26">час написання цього</dfn>, Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів для даних у **JSON-схемі**. Але нижче можна прочитати про обхідний шлях.
### Специфічні для OpenAPI `examples` { #openapi-specific-examples } ### Специфічні для OpenAPI `examples` { #openapi-specific-examples }

View File

@ -73,11 +73,11 @@ OpenAPI визначає такі схеми безпеки:
* `apiKey`: специфічний для застосунку ключ, який може передаватися через: * `apiKey`: специфічний для застосунку ключ, який може передаватися через:
* Параметр запиту. * Параметр запиту.
* Заголовок. * Заголовок.
* Cookie. * Кукі.
* `http`: стандартні системи HTTP-автентифікації, включаючи: * `http`: стандартні системи HTTP-автентифікації, включаючи:
* `bearer`: заголовок `Authorization` зі значенням `Bearer ` та токеном. Це успадковано з OAuth2. * `bearer`: заголовок `Authorization` зі значенням `Bearer ` та токеном. Це успадковано з OAuth2.
* HTTP Basic автентифікацію. * базову автентифікацію HTTP.
* HTTP Digest тощо. * HTTP дайджест тощо.
* `oauth2`: усі способи обробки безпеки за допомогою OAuth2 (так звані «потоки»). * `oauth2`: усі способи обробки безпеки за допомогою OAuth2 (так звані «потоки»).
* Декілька з цих потоків підходять для створення провайдера автентифікації OAuth 2.0 (наприклад, Google, Facebook, X (Twitter), GitHub тощо): * Декілька з цих потоків підходять для створення провайдера автентифікації OAuth 2.0 (наприклад, Google, Facebook, X (Twitter), GitHub тощо):
* `implicit` * `implicit`

View File

@ -7,7 +7,7 @@
* Імпортуйте `StaticFiles`. * Імпортуйте `StaticFiles`.
* «Під'єднати» екземпляр `StaticFiles()` з вказанням необхідного шляху. * «Під'єднати» екземпляр `StaticFiles()` з вказанням необхідного шляху.
{* ../../docs_src/static_files/tutorial001_py39.py hl[2,6] *} {* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *}
/// note | Технічні деталі /// note | Технічні деталі

View File

@ -30,7 +30,7 @@ $ pip install httpx
Записуйте прості `assert`-вирази зі стандартними виразами Python, які потрібно перевірити (це також стандарт для `pytest`). Записуйте прості `assert`-вирази зі стандартними виразами Python, які потрібно перевірити (це також стандарт для `pytest`).
{* ../../docs_src/app_testing/tutorial001_py39.py hl[2,12,15:18] *} {* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
/// tip | Порада /// tip | Порада
@ -76,7 +76,7 @@ $ pip install httpx
У файлі `main.py` знаходиться ваш застосунок **FastAPI**: У файлі `main.py` знаходиться ваш застосунок **FastAPI**:
{* ../../docs_src/app_testing/app_a_py39/main.py *} {* ../../docs_src/app_testing/app_a_py310/main.py *}
### Файл тестування { #testing-file } ### Файл тестування { #testing-file }
@ -90,9 +90,9 @@ $ pip install httpx
│   └── test_main.py │   └── test_main.py
``` ```
Оскільки цей файл знаходиться в тому ж пакеті, ви можете використовувати відносний імпорт, щоб імпортувати об'єкт `app` із модуля `main` (`main.py`): Оскільки цей файл знаходиться в тому ж пакеті, ви можете використовувати відносний імпорт, щоб імпортувати об'єкт `app` із модуля `main` (`main.py`):
{* ../../docs_src/app_testing/app_a_py39/test_main.py hl[3] *} {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
...і написати код для тестів так само як і раніше. ...і написати код для тестів так само як і раніше.