Коли вам потрібно надіслати дані з клієнта (скажімо, браузера) до вашого API, ви надсилаєте їх як тіло запиту.
Тіло запиту — це дані, надіслані клієнтом до вашого API. Тіло відповіді — це дані, які ваш API надсилає клієнту.
Ваш API майже завжди має надсилати тіло відповіді. Але клієнтам не обов’язково потрібно постійно надсилати тіла запитів.
Щоб оголосити тіло запиту, ви використовуєте Pydantic моделі з усією їх потужністю та перевагами.
!!! info
Щоб надіслати дані, ви повинні використовувати один із: POST
(більш поширений), PUT
, DELETE
або PATCH
.
Надсилання тіла із запитом `GET` має невизначену поведінку в специфікаціях, проте воно підтримується FastAPI лише для дуже складних/екстремальних випадків використання.
Оскільки це не рекомендується, інтерактивна документація з Swagger UI не відображатиме документацію для тіла запиту під час використання `GET`, і проксі-сервери в середині можуть не підтримувати її.
Спочатку вам потрібно імпортувати BaseModel
з pydantic
:
=== "Python 3.8 і вище"
```Python hl_lines="4"
{!> ../../../docs_src/body/tutorial001.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="2"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
Потім ви оголошуєте свою модель даних як клас, який успадковується від BaseModel
.
Використовуйте стандартні типи Python для всіх атрибутів:
=== "Python 3.8 і вище"
```Python hl_lines="7-11"
{!> ../../../docs_src/body/tutorial001.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="5-9"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
Так само, як і при оголошенні параметрів запиту, коли атрибут моделі має значення за замовчуванням, він не є обов’язковим. В іншому випадку це потрібно. Використовуйте None
, щоб зробити його необов'язковим.
Наприклад, ця модель вище оголошує JSON "об'єкт
" (або Python dict
), як:
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
...оскільки description
і tax
є необов'язковими (зі значенням за замовчуванням None
), цей JSON "об'єкт
" також буде дійсним:
{
"name": "Foo",
"price": 45.2
}
Щоб додати модель даних до вашої операції шляху, оголосіть її так само, як ви оголосили параметри шляху та запиту:
=== "Python 3.8 і вище"
```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial001.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial001_py310.py!}
```
...і вкажіть її тип як модель, яку ви створили, Item
.
Лише з цим оголошенням типу Python FastAPI буде:
- Читати тіло запиту як JSON.
- Перетворювати відповідні типи (якщо потрібно).
- Валідувати дані.
- Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними.
- Надавати отримані дані у параметрі
item
.- Оскільки ви оголосили його у функції як тип
Item
, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів.
- Оскільки ви оголосили його у функції як тип
- Генерувати JSON Schema визначення для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту.
- Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією інтерфейсу користувача.
Схеми JSON ваших моделей будуть частиною вашої схеми, згенерованої OpenAPI, і будуть показані в інтерактивній API документації:
А також використовуватимуться в API документації всередині кожної операції шляху, якій вони потрібні:
У вашому редакторі, всередині вашої функції, ви будете отримувати підказки типу та завершення скрізь (це б не сталося, якби ви отримали dict
замість моделі Pydantic):
Ви також отримуєте перевірку помилок на наявність операцій з неправильним типом:
Це не випадково, весь каркас був побудований навколо цього дизайну.
І він був ретельно перевірений на етапі проектування, перед будь-яким впровадженням, щоб переконатися, що він працюватиме з усіма редакторами.
Були навіть деякі зміни в самому Pydantic, щоб підтримати це.
Попередні скріншоти були зроблені у Visual Studio Code.
Але ви отримаєте ту саму підтримку редактора у PyCharm та більшість інших редакторів Python:
!!! tip Якщо ви використовуєте PyCharm як ваш редактор, ви можете використати Pydantic PyCharm Plugin.
Він покращує підтримку редакторів для моделей Pydantic за допомогою:
* автозаповнення
* перевірки типу
* рефакторингу
* пошуку
* інспекції
Усередині функції ви можете отримати прямий доступ до всіх атрибутів об’єкта моделі:
=== "Python 3.8 і вище"
```Python hl_lines="21"
{!> ../../../docs_src/body/tutorial002.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="19"
{!> ../../../docs_src/body/tutorial002_py310.py!}
```
Ви можете одночасно оголошувати параметри шляху та тіло запиту.
FastAPI розпізнає, що параметри функції, які відповідають параметрам шляху, мають бути взяті з шляху, а параметри функції, які оголошуються як моделі Pydantic, взяті з тіла запиту.
=== "Python 3.8 і вище"
```Python hl_lines="17-18"
{!> ../../../docs_src/body/tutorial003.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="15-16"
{!> ../../../docs_src/body/tutorial003_py310.py!}
```
Ви також можете оголосити параметри тіло, шлях і запит одночасно.
FastAPI розпізнає кожен з них і візьме дані з потрібного місця.
=== "Python 3.8 і вище"
```Python hl_lines="18"
{!> ../../../docs_src/body/tutorial004.py!}
```
=== "Python 3.10 і вище"
```Python hl_lines="16"
{!> ../../../docs_src/body/tutorial004_py310.py!}
```
Параметри функції будуть розпізнаватися наступним чином:
- Якщо параметр також оголошено в шляху, він використовуватиметься як параметр шляху.
- Якщо параметр має сингулярний тип (наприклад,
int
,float
,str
,bool
тощо), він буде інтерпретуватися як параметр запиту. - Якщо параметр оголошується як тип Pydantic моделі, він інтерпретується як тіло запиту.
!!! note FastAPI буде знати, що значення "q" не є обов'язковим через значення за замовчуванням "= None".
`Optional` у `Optional[str]` не використовується FastAPI, але дозволить вашому редактору надати вам кращу підтримку та виявляти помилки.
Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри Body. Перегляньте документацію для Тіло – Кілька параметрів: сингулярні значення в тілі{.internal-link target=_blank}.