committed by
GitHub
2 changed files with 190 additions and 0 deletions
@ -0,0 +1,189 @@ |
|||||
|
# Объявление примера запроса данных |
||||
|
|
||||
|
Вы можете объявлять примеры данных, которые ваше приложение может получать. |
||||
|
|
||||
|
Вот несколько способов, как это можно сделать. |
||||
|
|
||||
|
## Pydantic `schema_extra` |
||||
|
|
||||
|
Вы можете объявить ключ `example` для модели Pydantic, используя класс `Config` и переменную `schema_extra`, как описано в <a href="https://pydantic-docs.helpmanual.io/usage/schema/#schema-customization" class="external-link" target="_blank">Pydantic документации: Настройка схемы</a>: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="13-21" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+" |
||||
|
|
||||
|
```Python hl_lines="15-23" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
Эта дополнительная информация будет включена в **JSON Schema** выходных данных для этой модели, и она будет использоваться в документации к API. |
||||
|
|
||||
|
!!! tip Подсказка |
||||
|
Вы можете использовать тот же метод для расширения JSON-схемы и добавления своей собственной дополнительной информации. |
||||
|
|
||||
|
Например, вы можете использовать это для добавления дополнительной информации для пользовательского интерфейса в вашем веб-приложении и т.д. |
||||
|
|
||||
|
## Дополнительные аргументы поля `Field` |
||||
|
|
||||
|
При использовании `Field()` с моделями Pydantic, вы также можете объявлять дополнительную информацию для **JSON Schema**, передавая любые другие произвольные аргументы в функцию. |
||||
|
|
||||
|
Вы можете использовать это, чтобы добавить аргумент `example` для каждого поля: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="2 8-11" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+" |
||||
|
|
||||
|
```Python hl_lines="4 10-13" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! warning Внимание |
||||
|
Имейте в виду, что эти дополнительные переданные аргументы не добавляют никакой валидации, только дополнительную информацию для документации. |
||||
|
|
||||
|
## Использование `example` и `examples` в OpenAPI |
||||
|
|
||||
|
При использовании любой из этих функций: |
||||
|
|
||||
|
* `Path()` |
||||
|
* `Query()` |
||||
|
* `Header()` |
||||
|
* `Cookie()` |
||||
|
* `Body()` |
||||
|
* `Form()` |
||||
|
* `File()` |
||||
|
|
||||
|
вы также можете добавить аргумент, содержащий `example` или группу `examples` с дополнительной информацией, которая будет добавлена в **OpenAPI**. |
||||
|
|
||||
|
### Параметр `Body` с аргументом `example` |
||||
|
|
||||
|
Здесь мы передаём аргумент `example`, как пример данных ожидаемых в параметре `Body()`: |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="22-27" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="22-27" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+" |
||||
|
|
||||
|
```Python hl_lines="23-28" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial003_an.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.10+ non-Annotated" |
||||
|
|
||||
|
!!! tip Заметка |
||||
|
Рекомендуется использовать версию с `Annotated`, если это возможно. |
||||
|
|
||||
|
```Python hl_lines="18-23" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+ non-Annotated" |
||||
|
|
||||
|
!!! tip Заметка |
||||
|
Рекомендуется использовать версию с `Annotated`, если это возможно. |
||||
|
|
||||
|
```Python hl_lines="20-25" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial003.py!} |
||||
|
``` |
||||
|
|
||||
|
### Аргумент "example" в UI документации |
||||
|
|
||||
|
С любым из вышеуказанных методов это будет выглядеть так в `/docs`: |
||||
|
|
||||
|
<img src="/img/tutorial/body-fields/image01.png"> |
||||
|
|
||||
|
### `Body` с аргументом `examples` |
||||
|
|
||||
|
В качестве альтернативы одному аргументу `example`, вы можете передавать `examples` используя тип данных `dict` с **несколькими примерами**, каждый из которых содержит дополнительную информацию, которая также будет добавлена в **OpenAPI**. |
||||
|
|
||||
|
Ключи `dict` указывают на каждый пример, а значения для каждого из них - на еще один тип `dict` с дополнительной информацией. |
||||
|
|
||||
|
Каждый конкретный пример типа `dict` в аргументе `examples` может содержать: |
||||
|
|
||||
|
* `summary`: Краткое описание для примера. |
||||
|
* `description`: Полное описание, которое может содержать текст в формате Markdown. |
||||
|
* `value`: Это конкретный пример, который отображается, например, в виде типа `dict`. |
||||
|
* `externalValue`: альтернатива параметру `value`, URL-адрес, указывающий на пример. Хотя это может не поддерживаться таким же количеством инструментов разработки и тестирования API, как параметр `value`. |
||||
|
|
||||
|
=== "Python 3.10+" |
||||
|
|
||||
|
```Python hl_lines="23-49" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.9+" |
||||
|
|
||||
|
```Python hl_lines="23-49" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+" |
||||
|
|
||||
|
```Python hl_lines="24-50" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial004_an.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.10+ non-Annotated" |
||||
|
|
||||
|
!!! tip Заметка |
||||
|
Рекомендуется использовать версию с `Annotated`, если это возможно. |
||||
|
|
||||
|
```Python hl_lines="19-45" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
=== "Python 3.6+ non-Annotated" |
||||
|
|
||||
|
!!! tip Заметка |
||||
|
Рекомендуется использовать версию с `Annotated`, если это возможно. |
||||
|
|
||||
|
```Python hl_lines="21-47" |
||||
|
{!> ../../../docs_src/schema_extra_example/tutorial004.py!} |
||||
|
``` |
||||
|
|
||||
|
### Аргумент "examples" в UI документации |
||||
|
|
||||
|
С аргументом `examples`, добавленным в `Body()`, страница документации `/docs` будет выглядеть так: |
||||
|
|
||||
|
<img src="/img/tutorial/body-fields/image02.png"> |
||||
|
|
||||
|
## Технические Детали |
||||
|
|
||||
|
!!! warning Внимание |
||||
|
Эти технические детали относятся к стандартам **JSON Schema** и **OpenAPI**. |
||||
|
|
||||
|
Если предложенные выше идеи уже работают для вас, возможно этого будет достаточно и эти детали вам не потребуются, можете спокойно их пропустить. |
||||
|
|
||||
|
Когда вы добавляете пример внутрь модели Pydantic, используя `schema_extra` или `Field(example="something")`, этот пример добавляется в **JSON Schema** для данной модели Pydantic. |
||||
|
|
||||
|
И эта **JSON Schema** модели Pydantic включается в **OpenAPI** вашего API, а затем используется в UI документации. |
||||
|
|
||||
|
Поля `example` как такового не существует в стандартах **JSON Schema**. В последних версиях JSON-схемы определено поле <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a>, но OpenAPI 3.0.3 основан на более старой версии JSON-схемы, которая не имела поля `examples`. |
||||
|
|
||||
|
Таким образом, OpenAPI 3.0.3 определяет своё собственное поле <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#fixed-fields-20" class="external-link" target="_blank">`example`</a> для модифицированной версии **JSON Schema**, которую он использует чтобы достичь той же цели (однако это именно поле `example`, а не `examples`), и именно это используется API в UI документации (с интеграцией Swagger UI). |
||||
|
|
||||
|
Итак, хотя поле `example` не является частью JSON-схемы, оно является частью настраиваемой версии JSON-схемы в OpenAPI, и именно это поле будет использоваться в UI документации. |
||||
|
|
||||
|
Однако, когда вы используете поле `example` или `examples` с любой другой функцией (`Query()`, `Body()`, и т.д.), эти примеры не добавляются в JSON-схему, которая описывает эти данные (даже в собственную версию JSON-схемы OpenAPI), они добавляются непосредственно в объявление *операции пути* в OpenAPI (вне частей OpenAPI, которые используют JSON-схему). |
||||
|
|
||||
|
Для функций `Path()`, `Query()`, `Header()`, и `Cookie()`, аргументы `example` или `examples` добавляются в <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#parameter-object" class="external-link" target="_blank">определение OpenAPI, к объекту `Parameter Object` (в спецификации)</a>. |
||||
|
|
||||
|
И для функций `Body()`, `File()` и `Form()` аргументы `example` или `examples` аналогично добавляются в <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#mediaTypeObject" class="external-link" target="_blank"> определение OpenAPI, к объекту `Request Body Object`, в поле `content` в объекте `Media Type Object` (в спецификации)</a>. |
||||
|
|
||||
|
С другой стороны, существует более новая версия OpenAPI: **3.1.0**, недавно выпущенная. Она основана на последней версии JSON-схемы и большинство модификаций из OpenAPI JSON-схемы удалены в обмен на новые возможности из последней версии JSON-схемы, так что все эти мелкие отличия устранены. Тем не менее, Swagger UI в настоящее время не поддерживает OpenAPI 3.1.0, поэтому пока лучше продолжать использовать вышеупомянутые методы. |
Loading…
Reference in new issue