mirror of
https://github.com/fastapi/fastapi.git
synced 2026-02-13 07:41:06 -05:00
Compare commits
2 Commits
master
...
sync-trans
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1263fde636 | ||
|
|
5cfd7f7bbf |
@@ -58,9 +58,9 @@ Flask — це «мікрофреймворк», він не включає ін
|
||||
|
||||
/// check | Надихнуло **FastAPI** на
|
||||
|
||||
Бути мікрофреймоворком. Зробити легким комбінування та поєднання необхідних інструментів та частин.
|
||||
Бути мікрофреймворком. Зробити легким комбінування та поєднання необхідних інструментів та частин.
|
||||
|
||||
Мати просту та легку у використанні систему маршрутизації.
|
||||
Мати просту та легку у використанні систему маршрутизації.
|
||||
|
||||
///
|
||||
|
||||
@@ -100,9 +100,9 @@ def read_url():
|
||||
|
||||
/// check | Надихнуло **FastAPI** на
|
||||
|
||||
* Майте простий та інтуїтивно зрозумілий API.
|
||||
* Використовуйте імена (операції) методів HTTP безпосередньо, простим та інтуїтивно зрозумілим способом.
|
||||
* Розумні параметри за замовчуванням, але потужні налаштування.
|
||||
* Мати простий та інтуїтивно зрозумілий API.
|
||||
* Використовувати імена (операції) методів HTTP безпосередньо, простим та інтуїтивно зрозумілим способом.
|
||||
* Мати розумні параметри за замовчуванням, але потужні налаштування.
|
||||
|
||||
///
|
||||
|
||||
@@ -122,12 +122,12 @@ def read_url():
|
||||
|
||||
Прийняти і використовувати відкритий стандарт для специфікацій API замість спеціальної схеми.
|
||||
|
||||
Інтегрувати інструменти інтерфейсу на основі стандартів:
|
||||
Інтегрувати інструменти інтерфейсу на основі стандартів:
|
||||
|
||||
* <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>
|
||||
|
||||
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для 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 }
|
||||
|
||||
Однією з головних функцій, необхідних для систем API, є "<abbr title="також звана marshalling, conversion">серіалізація</abbr>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
|
||||
Однією з головних функцій, необхідних для систем API, є "<dfn title="також відома як: marshalling, перетворення">серіалізація</dfn>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
|
||||
|
||||
Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних.
|
||||
|
||||
@@ -145,7 +145,7 @@ def read_url():
|
||||
|
||||
Marshmallow створено для забезпечення цих функцій. Це чудова бібліотека, і я часто нею користувався раніше.
|
||||
|
||||
Але він був створений до того, як існували підказки типу Python. Отже, щоб визначити кожну <abbr title="визначення того, як дані повинні бути сформовані">схему</abbr>, вам потрібно використовувати спеціальні утиліти та класи, надані Marshmallow.
|
||||
Але він був створений до того, як існували підказки типу Python. Отже, щоб визначити кожну <dfn title="визначення того, як дані повинні бути сформовані">схему</dfn>, вам потрібно використовувати спеціальні утиліти та класи, надані Marshmallow.
|
||||
|
||||
/// check | Надихнуло **FastAPI** на
|
||||
|
||||
@@ -155,7 +155,7 @@ Marshmallow створено для забезпечення цих функці
|
||||
|
||||
### <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.
|
||||
|
||||
@@ -217,7 +217,7 @@ APISpec був створений тими ж розробниками Marshmall
|
||||
|
||||
Ця комбінація 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-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a>
|
||||
@@ -255,7 +255,7 @@ Flask-apispec був створений тими ж розробниками Mar
|
||||
|
||||
Використовувати типи Python, щоб мати чудову підтримку редактора.
|
||||
|
||||
Мати потужну систему впровадження залежностей. Знайдіть спосіб звести до мінімуму повторення коду.
|
||||
Мати потужну систему впровадження залежностей. Знайдіть спосіб звести до мінімуму повторення коду.
|
||||
|
||||
///
|
||||
|
||||
@@ -267,7 +267,7 @@ Flask-apispec був створений тими ж розробниками Mar
|
||||
|
||||
Він використовував <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).
|
||||
|
||||
///
|
||||
|
||||
@@ -341,13 +341,13 @@ Hug створив Тімоті Крослі, той самий творець <
|
||||
|
||||
///
|
||||
|
||||
/// check | Надихнуло **FastAPI** на
|
||||
/// check | Ідеї, що надихнули **FastAPI**
|
||||
|
||||
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 }
|
||||
|
||||
Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою схеми JSON) на основі підказок типу Python.
|
||||
Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python.
|
||||
|
||||
Це робить його надзвичайно інтуїтивним.
|
||||
|
||||
@@ -411,15 +411,15 @@ Pydantic — це бібліотека для визначення переві
|
||||
|
||||
/// check | **FastAPI** використовує його для
|
||||
|
||||
Виконання перевірки всіх даних, серіалізації даних і автоматичної документацію моделі (на основі схеми JSON).
|
||||
Виконання перевірки всіх даних, серіалізації даних і автоматичної документації моделі (на основі Схеми JSON).
|
||||
|
||||
Потім **FastAPI** бере ці дані схеми JSON і розміщує їх у OpenAPI, окремо від усіх інших речей, які він робить.
|
||||
Потім **FastAPI** бере ці дані Схеми JSON і розміщує їх у OpenAPI, окремо від усіх інших речей, які він робить.
|
||||
|
||||
///
|
||||
|
||||
### <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), хоча вони в процесі цього.
|
||||
|
||||
Тим не менш, він уже використовується як «стандарт» кількома інструментами. Це значно покращує сумісність, оскільки ви можете переключити 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**.
|
||||
|
||||
Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер.
|
||||
Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер.
|
||||
|
||||
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}.
|
||||
Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
### На основі відкритих стандартів { #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).
|
||||
* Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури.
|
||||
* Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами.
|
||||
@@ -136,7 +136,7 @@ FastAPI має розумні **налаштування за замовчува
|
||||
|
||||
### Впровадження залежностей { #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 }
|
||||
|
||||
* 100% <abbr title="Обсяг коду, що автоматично тестується">покриття тестами</abbr>.
|
||||
* 100% <abbr title="Анотації типів у Python, завдяки яким ваш редактор і зовнішні інструменти можуть надавати кращу підтримку">анотована типами</abbr> кодова база.
|
||||
* 100% <dfn title="Обсяг коду, що автоматично тестується">покриття тестами</dfn>.
|
||||
* 100% <dfn title="Анотації типів у Python, завдяки яким ваш редактор і зовнішні інструменти можуть надавати кращу підтримку">анотована типами</dfn> кодова база.
|
||||
* Використовується в production-застосунках.
|
||||
|
||||
## Можливості Starlette { #starlette-features }
|
||||
@@ -190,7 +190,7 @@ FastAPI містить надзвичайно просту у використа
|
||||
* **Ніякої плутанини**:
|
||||
* Не потрібно вчити нову мікромову для визначення схем.
|
||||
* Якщо ви знаєте типи 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, Python `typing`’s `List` і `Dict` тощо.
|
||||
|
||||
@@ -40,7 +40,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
|
||||
* **Швидкий**: дуже висока продуктивність, на рівні з **NodeJS** та **Go** (завдяки Starlette та Pydantic). [Один із найшвидших Python-фреймворків](#performance).
|
||||
* **Швидке написання коду**: пришвидшує розробку функціоналу приблизно на 200%–300%. *
|
||||
* **Менше помилок**: зменшує приблизно на 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>
|
||||
|
||||
Якщо ви створюєте застосунок <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**. ⌨️ 🚀
|
||||
|
||||
@@ -368,7 +368,7 @@ item: Item
|
||||
* Валідацію даних:
|
||||
* Автоматичні та зрозумілі помилки, коли дані некоректні.
|
||||
* Валідацію навіть для глибоко вкладених JSON-обʼєктів.
|
||||
* <abbr title="також відоме як serialization, parsing, marshalling">Перетворення</abbr> вхідних даних: з мережі до даних і типів Python. Читання з:
|
||||
* <dfn title="також відоме як: серіалізація, парсинг, маршалінг">Перетворення</dfn> вхідних даних: з мережі до даних і типів Python. Читання з:
|
||||
* JSON.
|
||||
* Параметрів шляху.
|
||||
* Параметрів запиту.
|
||||
@@ -376,7 +376,7 @@ item: Item
|
||||
* Headers.
|
||||
* Forms.
|
||||
* Files.
|
||||
* <abbr title="також відоме як serialization, parsing, marshalling">Перетворення</abbr> вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
|
||||
* <dfn title="також відоме як: серіалізація, парсинг, маршалінг">Перетворення</dfn> вихідних даних: перетворення з даних і типів Python у мережеві дані (як JSON):
|
||||
* Перетворення типів Python (`str`, `int`, `float`, `bool`, `list`, тощо).
|
||||
* Обʼєктів `datetime`.
|
||||
* Обʼєктів `UUID`.
|
||||
@@ -439,7 +439,7 @@ item: Item
|
||||
|
||||
* Оголошення **параметрів** з інших різних місць, як-от: **headers**, **cookies**, **form fields** та **files**.
|
||||
* Як встановлювати **обмеження валідації** як `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.
|
||||
* Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic).
|
||||
* Інтеграцію **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://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:
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Навчання { #learn }
|
||||
|
||||
У цьому розділі надані вступні розділи та навчальні матеріали для вивчення **FastAPI**.
|
||||
У цьому розділі надані вступні розділи та навчальні посібники для вивчення **FastAPI**.
|
||||
|
||||
Це можна розглядати як **книгу**, **курс**, або **офіційний** та рекомендований спосіб освоїти FastAPI. 😎
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
Python підтримує додаткові «підказки типів» (також звані «анотаціями типів»).
|
||||
|
||||
Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати <abbr title="наприклад: str, int, float, bool">тип</abbr> змінної.
|
||||
Ці **«підказки типів»** або анотації — це спеціальний синтаксис, що дозволяє оголошувати <dfn title="наприклад: str, int, float, bool">тип</dfn> змінної.
|
||||
|
||||
За допомогою оголошення типів для ваших змінних редактори та інструменти можуть надати вам кращу підтримку.
|
||||
|
||||
Це лише **швидкий туторіал / нагадування** про підказки типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **FastAPI**... що насправді дуже мало.
|
||||
Це лише **швидкий навчальний посібник / нагадування** про підказки типів у Python. Він покриває лише мінімум, необхідний щоб використовувати їх з **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`.
|
||||
* Перетворює першу літеру кожного з них у верхній регістр за допомогою `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 }
|
||||
|
||||
@@ -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">
|
||||
|
||||
Тепер ви знаєте, щоб виправити це, вам потрібно перетворити `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 }
|
||||
|
||||
@@ -133,29 +133,32 @@ John Doe
|
||||
* `bool`
|
||||
* `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 тощо).
|
||||
|
||||
Якщо ви можете використовувати **останні версії Python**, використовуйте приклади для останньої версії — вони матимуть **найкращий і найпростіший синтаксис**, наприклад, «**Python 3.10+**».
|
||||
* `list`
|
||||
* `tuple`
|
||||
* `set`
|
||||
* `dict`
|
||||
|
||||
#### 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 | Інформація
|
||||
|
||||
@@ -193,7 +196,7 @@ John Doe
|
||||
|
||||
Ви повинні зробити те ж саме, щоб оголосити `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`:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial008_py39.py hl[1] *}
|
||||
{* ../../docs_src/python_types/tutorial008_py310.py hl[1] *}
|
||||
|
||||
Це означає:
|
||||
|
||||
* Змінна `prices` — це `dict`:
|
||||
* Ключі цього `dict` мають тип `str` (скажімо, назва кожного елементу).
|
||||
* Значення цього `dict` мають тип `float` (скажімо, ціна кожного елементу).
|
||||
* Ключі цього `dict` мають тип `str` (скажімо, назва кожного предмета).
|
||||
* Значення цього `dict` мають тип `float` (скажімо, ціна кожного предмета).
|
||||
|
||||
#### Union { #union }
|
||||
|
||||
Ви можете оголосити, що змінна може бути будь-яким із **кількох типів**, наприклад `int` або `str`.
|
||||
|
||||
У Python 3.6 і вище (включаючи Python 3.10) ви можете використовувати тип `Union` з `typing` і вставляти в квадратні дужки можливі типи, які можна прийняти.
|
||||
Щоб визначити це, використовуйте <dfn title='також називають «побітовим оператором "або"», але це значення тут не актуальне'>вертикальну риску (`|`)</dfn>, щоб розділити обидва типи.
|
||||
|
||||
У Python 3.10 також є **новий синтаксис**, у якому ви можете розділити можливі типи за допомогою <abbr title='також називають «побітовим "або" оператором», але це значення тут не актуальне'>вертикальної смуги (`|`)</abbr>.
|
||||
|
||||
//// tab | Python 3.10+
|
||||
Це називається «union», тому що змінна може бути чимось із об’єднання цих двох множин типів.
|
||||
|
||||
```Python hl_lines="1"
|
||||
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.9+
|
||||
|
||||
```Python hl_lines="1 4"
|
||||
{!> ../../docs_src/python_types/tutorial008b_py39.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
В обох випадках це означає, що `item` може бути `int` або `str`.
|
||||
Це означає, що `item` може бути `int` або `str`.
|
||||
|
||||
#### Можливо `None` { #possibly-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+
|
||||
|
||||
```Python hl_lines="1"
|
||||
@@ -266,96 +245,7 @@ John Doe
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.9+
|
||||
|
||||
```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`
|
||||
* ...та інші.
|
||||
|
||||
////
|
||||
Використання `str | None` замість просто `str` дозволить редактору допомогти вам виявити помилки, коли ви могли б вважати, що значенням завжди є `str`, хоча насправді воно також може бути `None`.
|
||||
|
||||
### Класи як типи { #classes-as-types }
|
||||
|
||||
@@ -363,11 +253,11 @@ say_hi(name=None) # Це працює, None є валідним 🎉
|
||||
|
||||
Скажімо, у вас є клас `Person` з імʼям:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial010_py39.py hl[1:3] *}
|
||||
{* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *}
|
||||
|
||||
Потім ви можете оголосити змінну типу `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.
|
||||
|
||||
Ви побачите набагато більше цього всього на практиці в [Tutorial - User Guide](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>.
|
||||
|
||||
///
|
||||
Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
|
||||
|
||||
## Підказки типів з анотаціями метаданих { #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`.
|
||||
|
||||
@@ -435,7 +319,7 @@ Pydantic має спеціальну поведінку, коли ви вико
|
||||
|
||||
///
|
||||
|
||||
## Анотації типів у **FastAPI** { #type-hints-in-fastapi }
|
||||
## Підказки типів у **FastAPI** { #type-hints-in-fastapi }
|
||||
|
||||
**FastAPI** використовує ці підказки типів для виконання кількох речей.
|
||||
|
||||
@@ -453,12 +337,12 @@ Pydantic має спеціальну поведінку, коли ви вико
|
||||
* **Документування** API за допомогою OpenAPI:
|
||||
* який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
|
||||
|
||||
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}.
|
||||
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}.
|
||||
|
||||
Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас.
|
||||
|
||||
/// 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>.
|
||||
|
||||
///
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Фонові задачі { #background-tasks }
|
||||
|
||||
Ви можете створювати фонові задачі, які будуть виконуватися *після* повернення відповіді.
|
||||
Ви можете створювати фонові задачі, які будуть виконуватися після повернення відповіді.
|
||||
|
||||
Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді.
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
|
||||
## Використання `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` і передасть його як цей параметр.
|
||||
|
||||
@@ -31,13 +31,13 @@
|
||||
|
||||
І оскільки операція запису не використовує `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 }
|
||||
|
||||
Усередині вашої *функції операції шляху*, передайте функцію задачі в об'єкт *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()` приймає аргументи:
|
||||
|
||||
@@ -47,17 +47,17 @@
|
||||
|
||||
## Впровадження залежностей { #dependency-injection }
|
||||
|
||||
Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у підзалежності тощо.
|
||||
Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у функції операції шляху, у залежності (залежний), у підзалежності тощо.
|
||||
|
||||
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
|
||||
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
|
||||
|
||||
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
|
||||
|
||||
У цьому прикладі повідомлення будуть записані у файл `log.txt` *після* того, як відповідь буде надіслана.
|
||||
У цьому прикладі повідомлення будуть записані у файл `log.txt` після того, як відповідь буде надіслана.
|
||||
|
||||
Якщо у запиті був переданий query, він буде записаний у лог у фоновій задачі.
|
||||
Якщо у запиті був переданий параметр запиту, він буде записаний у лог у фоновій задачі.
|
||||
|
||||
А потім інша фонова задача, згенерована у *функції операції шляху*, запише повідомлення з використанням path параметра `email`.
|
||||
А потім інша фонова задача, згенерована у функції операції шляху, запише повідомлення з використанням параметра шляху `email`.
|
||||
|
||||
## Технічні деталі { #technical-details }
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`.
|
||||
|
||||
Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у *функції операції шляху*, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
|
||||
Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у функції операції шляху, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
|
||||
|
||||
Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
|
||||
|
||||
@@ -81,4 +81,4 @@
|
||||
|
||||
## Підсумок { #recap }
|
||||
|
||||
Імпортуйте та використовуйте `BackgroundTasks` як параметри у *функціях операції шляху* та залежностях, щоб додавати фонові задачі.
|
||||
Імпортуйте та використовуйте `BackgroundTasks` як параметри у функціях операції шляху та залежностях, щоб додавати фонові задачі.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
## Декілька параметрів тіла { #multiple-body-parameters }
|
||||
|
||||
У попередньому прикладі *операції шляху* очікували б JSON-тіло з атрибутами `Item`, наприклад:
|
||||
У попередньому прикладi *операції шляху* очікували б JSON-тіло з атрибутами `Item`, наприклад:
|
||||
|
||||
```JSON
|
||||
{
|
||||
@@ -106,13 +106,6 @@
|
||||
q: str | None = None
|
||||
```
|
||||
|
||||
Або в Python 3.9:
|
||||
|
||||
```Python
|
||||
q: Union[str, None] = None
|
||||
```
|
||||
|
||||
|
||||
Наприклад:
|
||||
|
||||
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -194,7 +194,7 @@ images: list[Image]
|
||||
|
||||
У цьому випадку ви можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
|
||||
|
||||
{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
|
||||
{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
@@ -216,6 +216,6 @@ images: list[Image]
|
||||
|
||||
* Підтримка в редакторі (автодоповнення всюди!)
|
||||
* Конвертація даних (парсинг/сериалізація)
|
||||
* Валідацію даних
|
||||
* Валідація даних
|
||||
* Документація схем
|
||||
* Автоматичне створення документації
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Щоб оголосити тіло **запиту**, ви використовуєте <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> моделі з усією їх потужністю та перевагами.
|
||||
|
||||
/// info | Інформація
|
||||
/// info
|
||||
|
||||
Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`.
|
||||
|
||||
@@ -73,8 +73,8 @@
|
||||
* Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними.
|
||||
* Надавати отримані дані у параметрі `item`.
|
||||
* Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів.
|
||||
* Генерувати <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> визначення для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту.
|
||||
* Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією <abbr title="User Interfaces – Інтерфейси користувача">UIs</abbr>.
|
||||
* Генерувати визначення <a href="https://json-schema.org" class="external-link" target="_blank">Схеми JSON</a> для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту.
|
||||
* Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією <abbr title="User Interfaces - Інтерфейси користувача">UIs</abbr>.
|
||||
|
||||
## Автоматична документація { #automatic-docs }
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
<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>.
|
||||
|
||||
@@ -151,11 +151,11 @@
|
||||
* Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**.
|
||||
* Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**.
|
||||
|
||||
/// note | Примітка
|
||||
/// note
|
||||
|
||||
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, ви також можете використовувати параметри **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}.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Моделі параметрів Cookie { #cookie-parameter-models }
|
||||
|
||||
Якщо у Вас є група **cookies**, які пов'язані між собою, Ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
|
||||
Якщо у вас є група **cookies**, які пов'язані між собою, ви можете створити **Pydantic-модель**, щоб оголосити їх. 🍪
|
||||
|
||||
Це дозволить Вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
|
||||
Це дозволить вам повторно **використовувати модель** у **різних місцях**, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
|
||||
|
||||
/// note | Примітка
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
|
||||
## Cookie з Pydantic-моделлю { #cookies-with-a-pydantic-model }
|
||||
|
||||
Оголосіть **cookie**-параметри, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
|
||||
Оголосіть **cookie**-параметри, які вам потрібні, у **Pydantic-моделі**, а потім оголосіть параметр як `Cookie`:
|
||||
|
||||
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
|
||||
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати Вам Pydantic-модель, яку Ви визначили.
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **cookies**, отриманих у запиті, і передавати вам Pydantic-модель, яку ви визначили.
|
||||
|
||||
## Перевірка у документації { #check-the-docs }
|
||||
|
||||
@@ -36,17 +36,17 @@
|
||||
|
||||
Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
|
||||
|
||||
Якщо Ви зайдете до **інтерфейсу документації API** за адресою `/docs`, Ви зможете побачити **документацію** для cookies у Ваших *операціях шляху*.
|
||||
Якщо ви зайдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies у ваших *операціях шляху*.
|
||||
|
||||
Але навіть якщо Ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і Ви побачите **помилку**, ніби Ви не ввели жодних значень.
|
||||
Але навіть якщо ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, 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` поля:
|
||||
|
||||
@@ -54,9 +54,9 @@
|
||||
|
||||
Якщо клієнт спробує надіслати якісь **додаткові 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
|
||||
{
|
||||
@@ -73,4 +73,4 @@
|
||||
|
||||
## Підсумок { #summary }
|
||||
|
||||
Ви можете використовувати **Pydantic-моделі** для оголошення <abbr title="Have a last cookie before you go. 🍪">**cookies**</abbr> у **FastAPI**. 😎
|
||||
Ви можете використовувати **Pydantic-моделі** для оголошення <dfn title="Візьміть останнє печиво перед тим, як підете. 🍪">**cookies**</dfn> у **FastAPI**. 😎
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Параметри Cookie { #cookie-parameters }
|
||||
# Параметри кукі { #cookie-parameters }
|
||||
|
||||
Ви можете визначати параметри Cookie таким же чином, як визначаються параметри `Query` і `Path`.
|
||||
Ви можете визначати параметри кукі таким же чином, як визначаються параметри `Query` і `Path`.
|
||||
|
||||
## Імпорт `Cookie` { #import-cookie }
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
## Визначення параметрів `Cookie` { #declare-cookie-parameters }
|
||||
|
||||
Потім визначте параметри cookie, використовуючи таку ж конструкцію як для `Path` і `Query`.
|
||||
Потім визначте параметри кукі, використовуючи таку ж конструкцію як для `Path` і `Query`.
|
||||
|
||||
Ви можете визначити значення за замовчуванням, а також усі додаткові параметри валідації чи анотації:
|
||||
|
||||
@@ -26,20 +26,20 @@
|
||||
|
||||
/// info
|
||||
|
||||
Для визначення cookies ви маєте використовувати `Cookie`, тому що в іншому випадку параметри будуть інтерпритовані, як параметри запиту.
|
||||
Для визначення кукі ви маєте використовувати `Cookie`, тому що в іншому випадку параметри будуть інтерпретовані як параметри запиту.
|
||||
|
||||
///
|
||||
|
||||
/// info
|
||||
|
||||
Майте на увазі, що оскільки **браузери обробляють cookies** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними.
|
||||
Майте на увазі, що оскільки **браузери обробляють кукі** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними.
|
||||
|
||||
Якщо ви перейдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies для ваших *операцій шляху*.
|
||||
Якщо ви перейдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для кукі для ваших *операцій шляху*.
|
||||
|
||||
Але навіть якщо ви **заповните дані** і натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не буде надіслано, і ви побачите повідомлення про **помилку**, ніби ви не ввели жодних значень.
|
||||
Але навіть якщо ви **заповните дані** і натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, кукі не буде надіслано, і ви побачите повідомлення про **помилку**, ніби ви не ввели жодних значень.
|
||||
|
||||
///
|
||||
|
||||
## Підсумки { #recap }
|
||||
|
||||
Визначайте cookies за допомогою `Cookie`, використовуючи той же спільний шаблон, що і `Query` та `Path`.
|
||||
Визначайте кукі за допомогою `Cookie`, використовуючи той же спільний шаблон, що і `Query` та `Path`.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 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 }
|
||||
|
||||
@@ -13,50 +13,49 @@
|
||||
* `https://localhost`
|
||||
* `http://localhost:8080`
|
||||
|
||||
Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими "джерелами".
|
||||
Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими «джерелами».
|
||||
|
||||
## Кроки { #steps }
|
||||
|
||||
Припустимо, що Ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`).
|
||||
Припустимо, що ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`).
|
||||
|
||||
Потім браузер надішле HTTP-запит `OPTIONS` до бекенду на порту `:80`, і якщо бекенд надішле відповідні заголовки, що дозволяють комунікацію з цього іншого джерела (`http://localhost:8080`), тоді браузер на порту `:8080` дозволить JavaScript у фронтенді надіслати свій запит до бекенду на порту `:80`.
|
||||
|
||||
Щоб досягти цього, бекенд на порту `:80` повинен мати список "дозволених джерел".
|
||||
Щоб досягти цього, бекенд на порту `:80` повинен мати список «дозволених джерел».
|
||||
|
||||
У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно.
|
||||
|
||||
## Символьне підставляння { #wildcards }
|
||||
## Дикі карти { #wildcards }
|
||||
|
||||
Можна також оголосити список як `"*"` ("символьне підставляння"), що означає дозвіл для всіх джерел.
|
||||
Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел.
|
||||
|
||||
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer Tokens, тощо.
|
||||
Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо.
|
||||
|
||||
Тому для коректної роботи краще явно вказувати дозволені джерела.
|
||||
|
||||
## Використання `CORSMiddleware` { #use-corsmiddleware }
|
||||
|
||||
Ви можете налаштувати це у Вашому додатку **FastAPI** за допомогою `CORSMiddleware`.
|
||||
Ви можете налаштувати це у вашому додатку **FastAPI** за допомогою `CORSMiddleware`.
|
||||
|
||||
* Імпортуйте `CORSMiddleware`.
|
||||
* Створіть список дозволених джерел (у вигляді рядків).
|
||||
* Додайте його як "middleware" у Ваш додаток **FastAPI**.
|
||||
* Додайте його як «проміжне програмне забезпечення» у ваш додаток **FastAPI**.
|
||||
|
||||
|
||||
Також можна вказати, чи дозволяє Ваш бекенд:
|
||||
Також можна вказати, чи дозволяє ваш бекенд:
|
||||
|
||||
* Облікові дані (заголовки авторизації, Cookies, тощо).
|
||||
* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"`
|
||||
* Конкретні 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_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>.
|
||||
@@ -67,7 +66,7 @@
|
||||
* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`.
|
||||
* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`.
|
||||
|
||||
Цей middleware обробляє два типи HTTP-запитів...
|
||||
Це проміжне програмне забезпечення обробляє два типи HTTP-запитів...
|
||||
|
||||
### Попередні CORS-запити { #cors-preflight-requests }
|
||||
|
||||
@@ -81,7 +80,7 @@
|
||||
|
||||
## Додаткова інформація { #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 | Технічні деталі
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
У вашому 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 }
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Найпростіший файл FastAPI може виглядати так:
|
||||
|
||||
{* ../../docs_src/first_steps/tutorial001_py39.py *}
|
||||
{* ../../docs_src/first_steps/tutorial001_py310.py *}
|
||||
|
||||
Скопіюйте це до файлу `main.py`.
|
||||
|
||||
@@ -183,7 +183,7 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
### Крок 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.
|
||||
|
||||
@@ -197,7 +197,7 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
### Крок 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`.
|
||||
|
||||
@@ -221,7 +221,7 @@ https://example.com/items/foo
|
||||
/items/foo
|
||||
```
|
||||
|
||||
/// info | Інформація
|
||||
/// info
|
||||
|
||||
«Шлях» також зазвичай називають «ендпоінтом» або «маршрутом».
|
||||
|
||||
@@ -266,12 +266,12 @@ https://example.com/items/foo
|
||||
|
||||
#### Визначте *декоратор операції шляху* { #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**, що функція одразу нижче відповідає за обробку запитів, які надходять до:
|
||||
|
||||
* шляху `/`
|
||||
* використовуючи <abbr title="an HTTP GET method"><code>get</code> операцію</abbr>
|
||||
* використовуючи <dfn title="HTTP метод GET"><code>get</code> операція</dfn>
|
||||
|
||||
/// info | `@decorator` Інформація
|
||||
|
||||
@@ -300,7 +300,7 @@ https://example.com/items/foo
|
||||
* `@app.patch()`
|
||||
* `@app.trace()`
|
||||
|
||||
/// tip | Порада
|
||||
/// tip
|
||||
|
||||
Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте.
|
||||
|
||||
@@ -320,7 +320,7 @@ https://example.com/items/foo
|
||||
* **операція**: це `get`.
|
||||
* **функція**: це функція нижче «декоратора» (нижче `@app.get("/")`).
|
||||
|
||||
{* ../../docs_src/first_steps/tutorial001_py39.py hl[7] *}
|
||||
{* ../../docs_src/first_steps/tutorial001_py310.py hl[7] *}
|
||||
|
||||
Це функція Python.
|
||||
|
||||
@@ -332,9 +332,9 @@ https://example.com/items/foo
|
||||
|
||||
Ви також можете визначити її як звичайну функцію замість `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}.
|
||||
|
||||
@@ -342,7 +342,7 @@ https://example.com/items/foo
|
||||
|
||||
### Крок 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` тощо.
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
### Імпорт `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 }
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`:
|
||||
|
||||
{* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *}
|
||||
{* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
|
||||
|
||||
### Отримана відповідь { #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 }
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
Ви можете додати власний обробник виключень за допомогою `@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`.
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
|
||||
Обробник виключень отримає `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-помилку:
|
||||
|
||||
@@ -159,7 +159,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
|
||||
|
||||
Наприклад, ви можете захотіти повернути відповідь у вигляді простого тексту замість 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 | Технічні деталі
|
||||
|
||||
@@ -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`:
|
||||
|
||||
{* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *}
|
||||
{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
|
||||
|
||||
У цьому прикладі ви просто друкуєте помилку з дуже виразним повідомленням, але ви зрозуміли основну ідею. Ви можете використовувати виключення, а потім просто повторно використати обробники виключень за замовчуванням.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Моделі параметрів заголовків { #header-parameter-models }
|
||||
|
||||
Якщо у Вас є група пов’язаних **параметрів заголовків**, Ви можете створити **Pydantic модель** для їх оголошення.
|
||||
Якщо у вас є група пов’язаних **параметрів заголовків**, ви можете створити **Pydantic модель** для їх оголошення.
|
||||
|
||||
Це дозволить Вам повторно **використовувати модель** в **різних місцях**, а також оголосити валідації та метадані для всіх параметрів одночасно. 😎
|
||||
Це дозволить вам повторно **використовувати модель** в **різних місцях**, а також оголосити валідації та метадані для всіх параметрів одночасно. 😎
|
||||
|
||||
/// note | Примітка
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
|
||||
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **заголовків** у запиті та передавати їх у створену Вами Pydantic модель.
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **заголовків** у запиті та передавати їх у створену вами Pydantic модель.
|
||||
|
||||
## Перевірка в документації { #check-the-docs }
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
## Заборонити додаткові заголовки { #forbid-extra-headers }
|
||||
|
||||
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** заголовки, які хочете отримати.
|
||||
У деяких особливих випадках (ймовірно, не дуже поширених) ви можете захотіти **обмежити** заголовки, які хочете отримати.
|
||||
|
||||
Ви можете використати конфігурацію моделі 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] *}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
/// warning | Попередження
|
||||
|
||||
Перед тим як встановити `convert_underscores` в `False`, пам’ятайте, що деякі HTTP-проксі та сервери забороняють використання заголовків із підкресленнями.
|
||||
Перед тим як встановити `convert_underscores` в `False`, пам’ятайте, що деякі HTTP-представники та сервери забороняють використання заголовків із підкресленнями.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -84,12 +84,12 @@ $ pip install "fastapi[standard]"
|
||||
|
||||
///
|
||||
|
||||
## Розширений посібник користувача { #advanced-user-guide }
|
||||
## Просунутий посібник користувача { #advanced-user-guide }
|
||||
|
||||
Існує також **Розширений посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**.
|
||||
Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**.
|
||||
|
||||
**Розширений посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям.
|
||||
**Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям.
|
||||
|
||||
Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте).
|
||||
|
||||
Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Розширеного посібника користувача**.
|
||||
Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**.
|
||||
|
||||
@@ -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 | Порада
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
Створіть метадані для своїх тегів і передайте їх у параметр `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_).
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
|
||||
Використовуйте параметр `tags` зі своїми *операціями шляху* (і `APIRouter`s), щоб призначити їх до різних тегів:
|
||||
|
||||
{* ../../docs_src/metadata/tutorial004_py39.py hl[21,26] *}
|
||||
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
|
||||
|
||||
/// info | Інформація
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
|
||||
Наприклад, щоб налаштувати його на `/api/v1/openapi.json`:
|
||||
|
||||
{* ../../docs_src/metadata/tutorial002_py39.py hl[3] *}
|
||||
{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
|
||||
|
||||
Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
|
||||
|
||||
@@ -117,4 +117,4 @@
|
||||
|
||||
Наприклад, щоб налаштувати Swagger UI на `/documentation` і вимкнути ReDoc:
|
||||
|
||||
{* ../../docs_src/metadata/tutorial003_py39.py hl[3] *}
|
||||
{* ../../docs_src/metadata/tutorial003_py310.py hl[3] *}
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
* Потім вона поверне `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>.
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
|
||||
Наприклад, ви можете додати власний заголовок `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()` оскільки він може бути більш точним для таких випадків. 🤓
|
||||
|
||||
@@ -92,4 +92,4 @@ app.add_middleware(MiddlewareB)
|
||||
|
||||
Ви можете пізніше прочитати більше про інші 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 в наступному розділі.
|
||||
|
||||
@@ -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()`.
|
||||
|
||||
{* ../../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 }
|
||||
|
||||
@@ -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`, оскільки ви не використовуєте значення за замовчуванням параметрів функції, цієї проблеми не буде, і, ймовірно, вам не потрібно буде використовувати `*`.
|
||||
|
||||
{* ../../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 }
|
||||
|
||||
@@ -97,7 +97,7 @@ Python нічого не зробить із цією `*`, але розпізн
|
||||
|
||||
Тут, завдяки `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 }
|
||||
|
||||
@@ -106,19 +106,19 @@ Python нічого не зробить із цією `*`, але розпізн
|
||||
* `gt`: `g`reater `t`han
|
||||
* `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`.
|
||||
|
||||
Ось де стає важливо мати можливість оголошувати <abbr title="greater than"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
|
||||
Ось де стає важливо мати можливість оголошувати <abbr title="greater than - більше ніж"><code>gt</code></abbr>, а не тільки <abbr title="greater than or equal - більше або дорівнює"><code>ge</code></abbr>. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`.
|
||||
|
||||
Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні.
|
||||
|
||||
Те саме стосується <abbr title="less than"><code>lt</code></abbr>.
|
||||
Те саме стосується <abbr title="less than - менше ніж"><code>lt</code></abbr>.
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}
|
||||
|
||||
## Підсумок { #recap }
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Ви можете оголосити «параметри» або «змінні» шляху, використовуючи той самий синтаксис, що й у форматованих рядках 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`.
|
||||
|
||||
@@ -16,17 +16,17 @@
|
||||
|
||||
Ви можете оголосити тип параметра шляху у функції, використовуючи стандартні анотації типів Python:
|
||||
|
||||
{* ../../docs_src/path_params/tutorial002_py39.py hl[7] *}
|
||||
{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
|
||||
|
||||
У цьому випадку `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>, то побачите відповідь:
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
{"item_id":3}
|
||||
```
|
||||
|
||||
/// check | Примітка
|
||||
/// check | Перевірте
|
||||
|
||||
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `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>
|
||||
|
||||
/// check | Примітка
|
||||
/// check | Перевірте
|
||||
|
||||
Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних.
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
|
||||
<img src="/img/tutorial/path-params/image01.png">
|
||||
|
||||
/// check | Примітка
|
||||
/// check | Перевірте
|
||||
|
||||
Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
|
||||
|
||||
@@ -118,19 +118,19 @@
|
||||
|
||||
Оскільки *операції шляху* оцінюються по черзі, вам потрібно переконатися, що шлях для `/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"`.
|
||||
|
||||
Так само ви не можете перевизначити операцію шляху:
|
||||
|
||||
{* ../../docs_src/path_params/tutorial003b_py39.py hl[6,11] *}
|
||||
{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
|
||||
|
||||
Завжди використовуватиметься перша, оскільки шлях збігається першим.
|
||||
|
||||
## Попередньо визначені значення { #predefined-values }
|
||||
|
||||
Якщо у вас є *операція шляху*, яка отримує *параметр шляху*, але ви хочете, щоб можливі коректні значення *параметра шляху* були попередньо визначені, ви можете використати стандартний Python <abbr title="Enumeration">`Enum`</abbr>.
|
||||
Якщо у вас є *операція шляху*, яка отримує *параметр шляху*, але ви хочете, щоб можливі коректні значення *параметра шляху* були попередньо визначені, ви можете використати стандартний Python <abbr title="Enumeration - Перелік">`Enum`</abbr>.
|
||||
|
||||
### Створіть клас `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 | Порада
|
||||
|
||||
Якщо вам цікаво, «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`):
|
||||
|
||||
{* ../../docs_src/path_params/tutorial005_py39.py hl[16] *}
|
||||
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
|
||||
|
||||
### Перевірте документацію { #check-the-docs }
|
||||
|
||||
@@ -168,13 +168,13 @@
|
||||
|
||||
Ви можете порівнювати його з *елементом перелічування* у створеному вами enum `ModelName`:
|
||||
|
||||
{* ../../docs_src/path_params/tutorial005_py39.py hl[17] *}
|
||||
{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
|
||||
|
||||
#### Отримайте *значення перелічування* { #get-the-enumeration-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 | Порада
|
||||
|
||||
@@ -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, наприклад:
|
||||
|
||||
@@ -227,7 +227,7 @@ OpenAPI не підтримує спосіб оголошення *параме
|
||||
|
||||
Отже, ви можете використати його так:
|
||||
|
||||
{* ../../docs_src/path_params/tutorial004_py39.py hl[6] *}
|
||||
{* ../../docs_src/path_params/tutorial004_py310.py hl[6] *}
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
@@ -242,7 +242,7 @@ OpenAPI не підтримує спосіб оголошення *параме
|
||||
З **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 та автоматичну документацію
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Моделі параметрів запиту { #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] *}
|
||||
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **query параметрів** у запиті та передавати їх у визначену вами Pydantic-модель.
|
||||
**FastAPI** буде **витягувати** дані для **кожного поля** з **параметрів запиту** у запиті та передавати їх у визначену вами Pydantic-модель.
|
||||
|
||||
## Перевірте документацію { #check-the-docs }
|
||||
|
||||
@@ -26,23 +26,23 @@
|
||||
<img src="/img/tutorial/query-param-models/image01.png">
|
||||
</div>
|
||||
|
||||
## Заборона зайвих Query параметрів { #forbid-extra-query-parameters }
|
||||
## Заборона зайвих параметрів запиту { #forbid-extra-query-parameters }
|
||||
|
||||
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** query параметри, які дозволено отримувати.
|
||||
У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** параметри запиту, які дозволено отримувати.
|
||||
|
||||
Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які зайві (`extra`) поля:
|
||||
|
||||
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
|
||||
|
||||
Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку** відповідь.
|
||||
Якщо клієнт спробує надіслати **зайві** дані у **параметрах запиту**, він отримає **відповідь з помилкою**.
|
||||
|
||||
Наприклад, якщо клієнт спробує надіслати query параметр `tool` зі значенням `plumbus`, як у цьому запиті:
|
||||
Наприклад, якщо клієнт спробує надіслати параметр запиту `tool` зі значенням `plumbus`, як у цьому запиті:
|
||||
|
||||
```http
|
||||
https://example.com/items/?limit=10&tool=plumbus
|
||||
```
|
||||
|
||||
Він отримає відповідь з **помилкою**, яка повідомить, що query параметр `tool ` не дозволено:
|
||||
Він отримає відповідь з **помилкою**, яка повідомить, що параметр запиту `tool` не дозволено:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -59,10 +59,10 @@ https://example.com/items/?limit=10&tool=plumbus
|
||||
|
||||
## Підсумок { #summary }
|
||||
|
||||
Ви можете використовувати **Pydantic-моделі** для оголошення **query параметрів** у **FastAPI**. 😎
|
||||
Ви можете використовувати **Pydantic-моделі** для оголошення **параметрів запиту** у **FastAPI**. 😎
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення cookie та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
|
||||
Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення кукі та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫
|
||||
|
||||
///
|
||||
|
||||
@@ -18,7 +18,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
|
||||
|
||||
## Додаткова валідація { #additional-validation }
|
||||
|
||||
Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, **його довжина не перевищувала 50 символів**.
|
||||
Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, його довжина не перевищувала 50 символів.
|
||||
|
||||
### Імпорт `Query` та `Annotated` { #import-query-and-annotated }
|
||||
|
||||
@@ -47,40 +47,16 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
|
||||
|
||||
Раніше ми мали таку анотацію типу:
|
||||
|
||||
//// tab | Python 3.10+
|
||||
|
||||
```Python
|
||||
q: str | None = None
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.9+
|
||||
|
||||
```Python
|
||||
q: Union[str, None] = None
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
Тепер ми загорнемо її у `Annotated`, і отримаємо:
|
||||
|
||||
//// tab | Python 3.10+
|
||||
|
||||
```Python
|
||||
q: Annotated[str | None] = None
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.9+
|
||||
|
||||
```Python
|
||||
q: Annotated[Union[str, None]] = None
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
|
||||
|
||||
А тепер переходимо до цікавого! 🎉
|
||||
@@ -93,23 +69,23 @@ q: Annotated[Union[str, None]] = None
|
||||
|
||||
Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим.
|
||||
|
||||
Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо **додаткову валідацію** для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
|
||||
Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо додаткову валідацію для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Тут ми використовуємо `Query()`, оскільки це **query параметр**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
|
||||
Тут ми використовуємо `Query()`, оскільки це query параметр. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
|
||||
|
||||
///
|
||||
|
||||
Тепер FastAPI:
|
||||
|
||||
* **Перевірить** дані, щоб переконатися, що їхня максимальна довжина — 50 символів
|
||||
* Покажe **чітку помилку** клієнту, якщо дані недійсні
|
||||
* **Задокументує** параметр в OpenAPI-схемі *операції шляху* (що відобразиться в **автоматично згенерованій документації**)
|
||||
* Перевірить дані, щоб переконатися, що їхня максимальна довжина — 50 символів
|
||||
* Покажe чітку помилку клієнту, якщо дані недійсні
|
||||
* Задокументує параметр в OpenAPI-схемі операції шляху (що відобразиться в автоматично згенерованій документації)
|
||||
|
||||
## Альтернативний (застарілий) метод: `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 | Порада
|
||||
|
||||
@@ -131,7 +107,6 @@ q: str | None = Query(default=None)
|
||||
|
||||
...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно:
|
||||
|
||||
|
||||
```Python
|
||||
q: str | None = None
|
||||
```
|
||||
@@ -144,7 +119,7 @@ q: str | None = None
|
||||
q: str | None = Query(default=None, max_length=50)
|
||||
```
|
||||
|
||||
Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI *операції шляху*.
|
||||
Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI операції шляху.
|
||||
|
||||
### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated }
|
||||
|
||||
@@ -174,13 +149,13 @@ q: str = Query(default="rick")
|
||||
|
||||
### Переваги використання `Annotated` { #advantages-of-annotated }
|
||||
|
||||
**Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓
|
||||
Використання `Annotated` є рекомендованим замість задання значення за замовчуванням у параметрах функції, оскільки воно краще з кількох причин. 🤓
|
||||
|
||||
Значення **за замовчуванням** параметра **функції** є **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌
|
||||
Значення за замовчуванням параметра функції є фактичним значенням за замовчуванням, що є більш інтуїтивним у Python загалом. 😌
|
||||
|
||||
Ви можете **викликати** ту саму функцію **в інших місцях** без FastAPI, і вона **працюватиме очікувано**. Якщо параметр є **обов’язковим** (без значення за замовчуванням), ваш **редактор** повідомить про помилку, а **Python** також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра.
|
||||
Ви можете викликати ту саму функцію в інших місцях без FastAPI, і вона працюватиме очікувано. Якщо параметр є обов’язковим (без значення за замовчуванням), ваш редактор повідомить про помилку, а Python також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра.
|
||||
|
||||
Якщо ви не використовуєте `Annotated`, а використовуєте **(старий) стиль значень за замовчуванням**, то при виклику цієї функції без FastAPI **в інших місцях**, потрібно **пам’ятати** передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
|
||||
Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
|
||||
|
||||
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як <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 }
|
||||
|
||||
Ви можете визначити <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] *}
|
||||
|
||||
@@ -212,7 +187,7 @@ q: str = Query(default="rick")
|
||||
|
||||
Припустімо, що ви хочете оголосити 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 | Примітка
|
||||
|
||||
@@ -242,7 +217,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
|
||||
|
||||
Тому, якщо вам потрібно оголосити значення як обов’язкове під час використання `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 }
|
||||
|
||||
@@ -266,7 +241,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
|
||||
http://localhost:8000/items/?q=foo&q=bar
|
||||
```
|
||||
|
||||
ви отримаєте кілька значень `q` *query параметрів* (`foo` і `bar`) у вигляді Python `list` у вашій *функції операції шляху*, у *параметрі функції* `q`.
|
||||
ви отримаєте кілька значень `q` query параметрів (`foo` і `bar`) у вигляді Python `list` у вашій функції операції шляху, у параметрі функції `q`.
|
||||
|
||||
Отже, відповідь на цей URL буде:
|
||||
|
||||
@@ -293,7 +268,7 @@ http://localhost:8000/items/?q=foo&q=bar
|
||||
|
||||
Ви також можете визначити значення за замовчуванням `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]`:
|
||||
|
||||
{* ../../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 | Примітка
|
||||
|
||||
@@ -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`:
|
||||
|
||||
@@ -390,9 +365,9 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
|
||||
|
||||
## Кастомна валідація { #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`.
|
||||
|
||||
@@ -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] *}
|
||||
|
||||
@@ -414,15 +389,15 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким **зовнішнім компонентом**, таким як база даних чи інший API, замість цього слід використовувати **FastAPI Dependencies** — ви дізнаєтесь про них пізніше.
|
||||
Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким зовнішнім компонентом, таким як база даних чи інший API, замість цього слід використовувати FastAPI Dependencies — ви дізнаєтесь про них пізніше.
|
||||
|
||||
Ці кастомні валідатори використовуються для речей, які можна перевірити лише з **тіими самими даними**, що надані в запиті.
|
||||
Ці кастомні валідатори використовуються для речей, які можна перевірити лише з тими самими даними, що надані в запиті.
|
||||
|
||||
///
|
||||
|
||||
### Зрозумійте цей код { #understand-that-code }
|
||||
|
||||
Головний момент — це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸
|
||||
Головний момент — це використання `AfterValidator` з функцією всередині `Annotated`. Можете пропустити цю частину, якщо хочете. 🤸
|
||||
|
||||
---
|
||||
|
||||
@@ -436,17 +411,17 @@ Pydantic також має <a href="https://docs.pydantic.dev/latest/concepts/va
|
||||
|
||||
#### Випадковий елемент { #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 елемента, він все одно отримає випадкову рекомендацію.
|
||||
|
||||
...ми робимо все це в **одному простому рядку**. 🤯 Хіба ви не любите Python? 🐍
|
||||
...ми робимо все це в одному простому рядку. 🤯 Хіба ви не любите Python? 🐍
|
||||
|
||||
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «query».
|
||||
|
||||
{* ../../docs_src/query_params/tutorial001_py39.py hl[9] *}
|
||||
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
|
||||
|
||||
Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
|
||||
|
||||
@@ -24,7 +24,7 @@ http://127.0.0.1:8000/items/?skip=0&limit=10
|
||||
Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів 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`.
|
||||
|
||||
/// check | Примітка
|
||||
/// check | Перевірте
|
||||
|
||||
Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
|
||||
|
||||
@@ -128,7 +128,7 @@ http://127.0.0.1:8000/items/foo?short=yes
|
||||
|
||||
Але якщо ви хочете зробити параметр 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`.
|
||||
|
||||
@@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Ви також можете використовувати `Enum` так само, як і з [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
|
||||
Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values){.internal-link target=_blank}.
|
||||
|
||||
///
|
||||
|
||||
@@ -20,13 +20,13 @@ $ pip install python-multipart
|
||||
|
||||
Імпортуйте `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 }
|
||||
|
||||
Створіть параметри файлів так само як ви б створювали `Body` або `Form`:
|
||||
|
||||
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[9] *}
|
||||
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
|
||||
|
||||
/// info | Інформація
|
||||
|
||||
@@ -54,7 +54,7 @@ $ pip install python-multipart
|
||||
|
||||
Визначте параметр файлу з типом `UploadFile`:
|
||||
|
||||
{* ../../docs_src/request_files/tutorial001_an_py39.py hl[14] *}
|
||||
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[14] *}
|
||||
|
||||
Використання `UploadFile` має кілька переваг перед `bytes`:
|
||||
|
||||
@@ -121,7 +121,7 @@ contents = myfile.file.read()
|
||||
|
||||
Але якщо форма містить файли, вона кодується як `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`, наприклад, щоб встановити додаткові метадані:
|
||||
|
||||
{* ../../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 }
|
||||
|
||||
@@ -153,7 +153,7 @@ contents = myfile.file.read()
|
||||
|
||||
Щоб це реалізувати, потрібно оголосити список `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`.
|
||||
|
||||
@@ -169,7 +169,7 @@ contents = myfile.file.read()
|
||||
|
||||
Так само як і раніше, ви можете використовувати `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 }
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ $ pip install python-multipart
|
||||
|
||||
Вам просто потрібно оголосити **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-модель, яку ви визначили.
|
||||
|
||||
@@ -48,7 +48,7 @@ $ pip install python-multipart
|
||||
|
||||
Ви можете використати конфігурацію 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] *}
|
||||
|
||||
Якщо клієнт спробує надіслати додаткові дані, він отримає **відповідь з помилкою**.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть <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
|
||||
$ pip install python-multipart
|
||||
@@ -16,15 +16,15 @@ $ pip install python-multipart
|
||||
|
||||
## Імпорт `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 }
|
||||
|
||||
Створіть параметри файлів та форми так само як і для `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`.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Дані форми { #form-data }
|
||||
|
||||
Якщо вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`.
|
||||
Коли вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`.
|
||||
|
||||
/// info | Інформація
|
||||
|
||||
@@ -18,17 +18,17 @@ $ pip install python-multipart
|
||||
|
||||
Імпортуйте `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 }
|
||||
|
||||
Створюйте параметри форми так само як ви б створювали `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`) тощо.
|
||||
|
||||
@@ -44,19 +44,19 @@ $ pip install python-multipart
|
||||
|
||||
///
|
||||
|
||||
## Про "поля форми" { #about-form-fields }
|
||||
## Про «поля форми» { #about-form-fields }
|
||||
|
||||
HTML-форми (`<form></form>`) надсилають дані на сервер у "спеціальному" кодуванні, яке відрізняється від JSON.
|
||||
HTML-форми (`<form></form>`) надсилають дані на сервер у «спеціальному» кодуванні, яке відрізняється від JSON.
|
||||
|
||||
**FastAPI** подбає про те, щоб зчитати ці дані з правильного місця, а не з JSON.
|
||||
|
||||
/// note | Технічні деталі
|
||||
|
||||
Дані з форм зазвичай кодуються за допомогою "типу медіа" `application/x-www-form-urlencoded`.
|
||||
Дані з форм зазвичай кодуються за допомогою «типу медіа» `application/x-www-form-urlencoded`.
|
||||
|
||||
Але якщо форма містить файли, вона кодується як `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>.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ FastAPI використовуватиме цей `response_model` для вик
|
||||
$ pip install email-validator
|
||||
```
|
||||
|
||||
or with:
|
||||
або так:
|
||||
|
||||
```console
|
||||
$ pip install "pydantic[email]"
|
||||
@@ -183,7 +183,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
|
||||
|
||||
Найпоширенішим випадком буде [повернення 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`.
|
||||
|
||||
@@ -193,7 +193,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
|
||||
|
||||
Ви також можете використати підклас `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 автоматично обробить цей простий випадок.
|
||||
|
||||
@@ -201,7 +201,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
|
||||
|
||||
Але коли ви повертаєте якийсь інший довільний об’єкт, що не є валідним типом Pydantic (наприклад, об’єкт бази даних), і анотуєте його так у функції, FastAPI спробує створити модель відповіді Pydantic на основі цієї анотації типу і це завершиться помилкою.
|
||||
|
||||
Те саме станеться, якщо ви використаєте <abbr title='Об’єднання (union) між кількома типами означає «будь-який із цих типів».'>union</abbr> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥:
|
||||
Те саме станеться, якщо у вас буде <dfn title="об'єднання між кількома типами означає «будь-який із цих типів»">об'єднання</dfn> між різними типами, де один або більше не є валідними типами Pydantic, наприклад, це завершиться помилкою 💥:
|
||||
|
||||
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* `@app.delete()`
|
||||
* тощо.
|
||||
|
||||
{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
|
||||
{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
|
||||
|
||||
/// note | Примітка
|
||||
|
||||
@@ -66,7 +66,7 @@ FastAPI знає про це і створить документацію OpenAP
|
||||
|
||||
/// 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».
|
||||
|
||||
@@ -82,7 +82,7 @@ FastAPI знає про це і створить документацію OpenAP
|
||||
|
||||
Ви можете використовувати зручні змінні з `fastapi.status`.
|
||||
|
||||
{* ../../docs_src/response_status_code/tutorial002_py39.py hl[1,6] *}
|
||||
{* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
|
||||
|
||||
Вони — просто для зручності, містять те саме число, але так ви можете скористатися автозаповненням редактора, щоб знайти їх:
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
|
||||
|
||||
{* ../../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-схеми** для цих даних тіла.
|
||||
|
||||
Втім, на момент написання цього (<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 }
|
||||
|
||||
|
||||
@@ -73,11 +73,11 @@ OpenAPI визначає такі схеми безпеки:
|
||||
* `apiKey`: специфічний для застосунку ключ, який може передаватися через:
|
||||
* Параметр запиту.
|
||||
* Заголовок.
|
||||
* Cookie.
|
||||
* Кукі.
|
||||
* `http`: стандартні системи HTTP-автентифікації, включаючи:
|
||||
* `bearer`: заголовок `Authorization` зі значенням `Bearer ` та токеном. Це успадковано з OAuth2.
|
||||
* HTTP Basic автентифікацію.
|
||||
* HTTP Digest тощо.
|
||||
* базову автентифікацію HTTP.
|
||||
* HTTP дайджест тощо.
|
||||
* `oauth2`: усі способи обробки безпеки за допомогою OAuth2 (так звані «потоки»).
|
||||
* Декілька з цих потоків підходять для створення провайдера автентифікації OAuth 2.0 (наприклад, Google, Facebook, X (Twitter), GitHub тощо):
|
||||
* `implicit`
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Імпортуйте `StaticFiles`.
|
||||
* «Під'єднати» екземпляр `StaticFiles()` з вказанням необхідного шляху.
|
||||
|
||||
{* ../../docs_src/static_files/tutorial001_py39.py hl[2,6] *}
|
||||
{* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *}
|
||||
|
||||
/// note | Технічні деталі
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ $ pip install httpx
|
||||
|
||||
Записуйте прості `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 | Порада
|
||||
|
||||
@@ -76,7 +76,7 @@ $ pip install httpx
|
||||
У файлі `main.py` знаходиться ваш застосунок **FastAPI**:
|
||||
|
||||
|
||||
{* ../../docs_src/app_testing/app_a_py39/main.py *}
|
||||
{* ../../docs_src/app_testing/app_a_py310/main.py *}
|
||||
|
||||
### Файл тестування { #testing-file }
|
||||
|
||||
@@ -90,9 +90,9 @@ $ pip install httpx
|
||||
│ └── 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] *}
|
||||
|
||||
|
||||
...і написати код для тестів так само як і раніше.
|
||||
|
||||
Reference in New Issue
Block a user