committed by
GitHub
1 changed files with 196 additions and 0 deletions
@ -0,0 +1,196 @@ |
|||||
|
# Модели Query-Параметров |
||||
|
|
||||
|
Если у вас есть группа связанных **query-параметров**, то вы можете объединить их в одну **Pydantic-модель**. |
||||
|
|
||||
|
Это позволит вам **переиспользовать модель** в **разных местах**, устанавливать валидаторы и метаданные, в том числе для сразу всех параметров, в одном месте. 😎 |
||||
|
|
||||
|
/// note | Заметка |
||||
|
|
||||
|
Этот функционал доступен с версии `0.115.0`. 🤓 |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
## Pydantic-Модель для Query-Параметров |
||||
|
|
||||
|
Объявите нужные **query-параметры** в **Pydantic-модели**, а после аннотируйте параметр как `Query`: |
||||
|
|
||||
|
//// tab | Python 3.10+ |
||||
|
|
||||
|
```Python hl_lines="9-13 17" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.9+ |
||||
|
|
||||
|
```Python hl_lines="8-12 16" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ |
||||
|
|
||||
|
```Python hl_lines="10-14 18" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_an.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.10+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="9-13 17" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.9+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="8-12 16" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="9-13 17" |
||||
|
{!> ../../docs_src/query_param_models/tutorial001_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
**FastAPI извлечёт** данные соответствующие **каждому полю модели** из **query-параметров** запроса и выдаст вам объявленную Pydantic-модель заполненную ими. |
||||
|
|
||||
|
## Проверьте Сгенерированную Документацию |
||||
|
|
||||
|
Вы можете посмотреть query-параметры в графическом интерфейсе сгенерированной документации по пути `/docs`: |
||||
|
|
||||
|
<div class="screenshot"> |
||||
|
<img src="/img/tutorial/query-param-models/image01.png"> |
||||
|
</div> |
||||
|
|
||||
|
## Запретить Дополнительные Query-Параметры |
||||
|
|
||||
|
В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** query-параметры, которые вы хотите получить. |
||||
|
|
||||
|
Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (`forbid`) все дополнительные (`extra`) поля. |
||||
|
|
||||
|
//// tab | Python 3.10+ |
||||
|
|
||||
|
```Python hl_lines="10" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.9+ |
||||
|
|
||||
|
```Python hl_lines="9" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ |
||||
|
|
||||
|
```Python hl_lines="11" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002_an.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.10+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="10" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.9+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="9" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ без Annotated |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
При возможности используйте версию с `Annotated`. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="11" |
||||
|
{!> ../../docs_src/query_param_models/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
Если клиент попробует отправить **дополнительные** данные в **query-параметрах**, то в ответ он получит **ошибку**. |
||||
|
|
||||
|
Например, если клиент попытается отправить query-параметр `tool` с значением `plumbus`, в виде: |
||||
|
|
||||
|
```http |
||||
|
https://example.com/items/?limit=10&tool=plumbus |
||||
|
``` |
||||
|
|
||||
|
То в ответ он получит **ошибку**, сообщающую ему, что query-параметр `tool` не разрешен: |
||||
|
|
||||
|
```json |
||||
|
{ |
||||
|
"detail": [ |
||||
|
{ |
||||
|
"type": "extra_forbidden", |
||||
|
"loc": ["query", "tool"], |
||||
|
"msg": "Extra inputs are not permitted", |
||||
|
"input": "plumbus" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Заключение |
||||
|
|
||||
|
Вы можете использовать **Pydantic-модели** для объявления **query-параметров** в **FastAPI**. 😎 |
||||
|
|
||||
|
/// tip | Совет |
||||
|
|
||||
|
Спойлер: вы также можете использовать Pydantic-модели для группировки кук (cookies) и заголовков (headers), но об этом вы прочитаете позже. 🤫 |
||||
|
|
||||
|
/// |
Loading…
Reference in new issue