13 KiB
Декларування прикладів вхідних даних
Ви можете задати приклади даних, які Ваш застосунок може отримувати.
Ось кілька способів, як це зробити.
Додаткові дані JSON-схеми в моделях Pydantic
Ви можете задати examples
для моделі Pydantic, які буде додано до згенерованої JSON-схеми.
//// tab | Pydantic v2
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
////
//// tab | Pydantic v1
{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *}
////
Ця додаткова інформація буде додана як є до JSON-схеми, і вона буде використовуватися в документації до API.
//// tab | Pydantic v2
У версії Pydantic 2 використовується атрибут model_config
, який приймає dict
, як описано в документації Pydantic: Конфігурація.
Ви можете встановити "json_schema_extra"
як dict
, що містить будь-які додаткові дані, які Ви хочете відобразити у згенерованій JSON-схемі, включаючи examples
.
////
//// tab | Pydantic v1
У версії Pydantic 1 використовується внутрішній клас Config
і параметр schema_extra
, як описано в документації Pydantic: Налаштування схеми.
Ви можете задати schema_extra
як dict
, що містить будь-які додаткові дані, які Ви хочете бачити у згенерованій JSON-схемі, включаючи examples
.
////
/// tip | Підказка
Ви можете використати ту ж техніку, щоб розширити JSON-схему і додати власну додаткову інформацію.
Наприклад, Ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо.
///
/// info | Інформація
OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку examples
, що є частиною стандарту JSON-схеми.
До цього підтримувався лише ключ example
з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з example
на examples
. 🤓
Більше про це можна прочитати в кінці цієї сторінки.
///
Додаткові аргументи Field
Коли ви використовуєте Field()
у моделях Pydantic, Ви також можете вказати додаткові examples
:
{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *}
examples
у JSON-схемі — OpenAPI
При використанні будь-кого з наступного:
Path()
Query()
Header()
Cookie()
Body()
Form()
File()
Ви також можете задати набір examples
з додатковою інформацією, яка буде додана до їхніх JSON-схем у OpenAPI.
Body
з examples
Тут ми передаємо examples
, які містять один приклад очікуваних даних у Body()
:
{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *}
Приклад у UI документації
За допомогою будь-якого з наведених вище методів це виглядатиме так у документації за /docs
:

Body
з кількома examples
Звичайно, Ви також можете передати кілька examples
:
{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *}
Коли Ви це робите, приклади будуть частиною внутрішньої JSON-схеми для цих даних.
Втім, на момент написання цього (26 серпня 2023), Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів у JSON-схеми. Але нижче можна прочитати про обхідний шлях.
Специфічні для OpenAPI examples
Ще до того, як JSON-схема почала підтримувати examples
, OpenAPI вже мала підтримку поля з такою ж назвою — examples
.
Це специфічне для OpenAPI поле examples
розміщується в іншій частині специфікації OpenAPI — у деталях кожної операції шляху, а не всередині самої JSON-схеми.
Swagger UI вже давно підтримує це поле examples
. Тому Ви можете використовувати його, щоб відображати кілька прикладів у документації.
Це поле examples
у специфікації OpenAPI — це dict
(словник) з кількома прикладами (а не список list
), кожен із яких може містити додаткову інформацію, що буде додана до OpenAPI.
Воно не включається до JSON Schema кожного параметра, а розміщується зовні, безпосередньо в операції шляху.
Використання параметра openapi_examples
Ви можете оголосити специфічні для OpenAPI examples
у FastAPI за допомогою параметра openapi_examples
для:
Path()
Query()
Header()
Cookie()
Body()
Form()
File()
Ключі словника (dict
) ідентифікують кожен приклад, а кожне значення dict
— кожен специфічний словник dict
в examples
може містити:
summary
: короткий опис прикладу.description
: розгорнутий опис (може містити Markdown).value
: сам приклад, наприклад, словник (dict
).externalValue
: альтернативаvalue
, URL-адреса, що вказує на приклад. Проте ця опція може не підтримуватися більшістю інструментів, на відміну відvalue
.
Використання виглядає так:
{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
Приклади OpenAPI у UI документації
З параметром openapi_examples
, доданим до Body()
, документація /docs
виглядатиме так:

Технічні деталі
/// tip | Підказка
Якщо Ви вже використовуєте FastAPI версії 0.99.0 або вище, Ви можете пропустити цей розділ.
Він більш актуальний для старих версій, до появи OpenAPI 3.1.0.
Можна вважати це коротким історичним екскурсом у OpenAPI та JSON Schema. 🤓
///
/// warning | Попередження
Це дуже технічна інформація про стандарти JSON Schema і OpenAPI.
Якщо вищезгадані ідеї вже працюють у Вас — можете не заглиблюватися в ці деталі.
///
До OpenAPI 3.1.0 специфікація використовувала стару та модифіковану версію JSON Schema.
Оскільки JSON Schema раніше не підтримувала examples
, OpenAPI додала власне поле examples
.
OpenAPI також додала example
і examples
до інших частин специфікації:
Parameter Object
(в специфікації) використовується FastAPI для:Path()
Query()
Header()
Cookie()
Request Body Object
, в поліcontent
, вMedia Type Object
(в специфікації) використовується FastAPI для:Body()
File()
Form()
/// info | Інформація
Цей старий параметр examples
, специфічний для OpenAPI, тепер називається openapi_examples
, починаючи з FastAPI версії 0.103.0
.
///
Поле examples
у JSON Schema
Пізніше JSON Schema додала поле examples
у нову версію специфікації.
І вже OpenAPI 3.1.0 базується на цій новій версії (JSON Schema 2020-12), яка включає поле examples
.
Тепер це поле examples
є пріоритетним і замінює старе (і кастомне) поле example
, яке стало застарілим.
Нове поле examples
у JSON Schema — це просто список (list
) прикладів, без додаткових метаданих (на відміну від OpenAPI).
/// info | Інформація
Навіть після того, як з'явився OpenAPI 3.1.0, який підтримував examples у JSON Schema, інструмент Swagger UI ще деякий час не підтримував цю версію (підтримка з’явилась з версії 5.0.0 🎉).
Через це версії FastAPI до 0.99.0 все ще використовували версії OpenAPI нижчі за 3.1.0.
///
Examples
в Pydantic і FastAPI
Коли Ви додаєте examples
у модель Pydantic через schema_extra
або Field(examples=["something"])
, ці приклади додаються до JSON Schema цієї моделі.
І ця JSON Schema Pydantic-моделі включається до OpenAPI Вашого API, а потім використовується в UI документації (docs UI).
У версіях FastAPI до 0.99.0 (починаючи з 0.99.0 використовується новіший OpenAPI 3.1.0), коли Ви використовували example
або examples
з іншими утилітами (Query()
, Body()
тощо), ці приклади не додавалися до JSON Schema, який описує ці дані (навіть не до власної версії JSON Schema у OpenAPI). Натомість вони додавалися безпосередньо до опису обробника шляху (path operation) в OpenAPI (тобто поза межами частин, які використовують JSON Schema).
Але тепер, коли FastAPI 0.99.0 і вище використовують OpenAPI 3.1.0, а той — JSON Schema 2020-12, разом із Swagger UI 5.0.0 і вище — все стало більш узгодженим, і examples тепер включаються до JSON Schema.
Swagger UI та специфічні для OpenAPI examples
Раніше (станом на 26 серпня 2023 року) Swagger UI не підтримував кілька прикладів у JSON Schema, тому користувачі не мали можливості показати декілька прикладів у документації.
Щоб вирішити це, FastAPI починаючи з версії 0.103.0 додав підтримку старого OpenAPI-специфічного поля examples
через новий параметр openapi_examples
. 🤓
Підсумок
Раніше я казав, що не люблю історію... а тепер ось я — розповідаю "технічні історичні" лекції. 😅
Коротко: оновіться до FastAPI 0.99.0 або вище — і все стане значно простішим, узгодженим та інтуїтивно зрозумілим, і Вам не доведеться знати всі ці історичні деталі. 😎