Валидация тела запроса с использованием моделей Pydantic
В FastAPI тела запросов может быть проверено, чтобы гарантировать отправку только определенных данных. Это крайне важно, чтобы снизить риски вредоносных атак. В разделе 2.2 данного курса мы уже заметили, что при установке FastAPI у нас вместе с ним был установлен и модуль pydantic.
Pydantic — это библиотека Python, которая выполняет проверку данных с помощью аннотаций типа Python. Модель в FastAPI — это структурированный класс, он определяет, как следует получать или анализировать данные.
Особенности Pydantic
Pydantic — это библиотека Python, которая предоставляет ряд функций проверки и анализа данных. Вот некоторые из основных особенностей Pydantic:
- Проверка данных: Pydantic включает функцию проверки, которая автоматически проверяет типы и значения атрибутов класса, гарантируя их правильность и соответствие любым заданным ограничениям. Также поддерживаются настраиваемые правила проверки с использованием подсказок, что позволяет пользователям определять дополнительные ограничения для своих данных.
- Поддержка многих типов данных. Pydantic поддерживает широкий спектр типов данных, включая списки, словари и вложенные модели, что упрощает определение и проверку сложных структур данных.
- Эффективность и лёгкость: Pydantic спроектирован так, чтобы быть быстрым и эффективным, с небольшой кодовой базой и минимальным количеством зависимостей. Он также хорошо документирован и прост в использовании, что делает его популярным выбором для проверки и анализа данных в Python.
- Открытый исходный код: Pydantic — это библиотека с открытым исходным кодом, лицензированная в соответствии с лицензией MIT, которая активно разрабатывается и поддерживается сообществом участников.
Модели создаются путем определения подкласса класса BaseModel Pydantic. Примерная модель выглядит следующим образом:
from pydantic import BaseModel
class Message(BaseModel):
id: int
text: str
Данная модель Message состоит из двух полей:
id, которое является целым числом,text, которое является строкой.
В результате данная модель будет представлена следующим образом:
{
"id": 0,
"text": "string"
}
Мы также, как и в валидации параметров можем устанавливать несколько типов для поля, и также делать поле не обязательным и устанавливать значение по умолчанию:
from pydantic import BaseModel
class Message(BaseModel):
id: int
description: str | None = None
text: str = "Simple text"
Поведение полей Pydantic можно настроить с помощью класса Field(). Он имеет те же свойства, что и функции Path(), Query() и Body(). Для числовых полей вы можете применить критерии проверки gt, ge, lt, le. Чтобы ограничить длину строки, существуют свойства min_length и max_length, также она может быть проверена с помощью регулярных выражений.
from pydantic import BaseModel, Field
class Message(BaseModel):
id: int
description: str | None = Field(default=None, description="The description of the message", max_length=300)
text: str = "Simple text"
В дополнение к стандартным типам данных Python, библиотека Pydantic определяет свои собственные типы:
HttpUrl: Это поле, по сути, является строкой со встроенной проверкой для URL. Тип HttpUrl принимает как HTTP, так и HTTPS схемы. Он требует указания TLD (домена верхнего уровня) и хоста, максимальная длина 2083 символа.AnyUrlпозволяет использовать любую схему (TLD не требуется, но хост обязателен).FileUrlпредназначено для хранения URL-адреса файла и не требует указания хоста.EmailStr: Это такая же строка, но которая должна быть действительным адресом электронной почты. Для проверки правильности представления электронной почты в виде строки требует установки модуляemail-validator.SecretStr: Этот тип данных используется в основном для хранения паролей или любой другой конфиденциальной информации, которая не должна появляться в логах или другом отслеживании. При преобразовании в JSON он будет отформатирован как '**********'.
Вложенные модели
Модели Pydantic также могут быть вложенными, например, следующие:
from pydantic import BaseModel
class Item(BaseModel):
description: str | None = None
text: str = "Simple text"
class Message(BaseModel):
id: int
item: Item
В результате данные модели будут представлены следующим образом:
{
"id": 0,
"item": {
"description": "string",
"text": "Simple text"
}
}
Мы узнали, что такое модели, как их создавать. Мы будем использовать их в оставшихся частях этого курса. В следующем шаге рассмотрим как принимать данные из модели и комбинировать параметры пути и запроса.
Данная модель
UserMessageсостоит из двух полей:id, которое является целым числом,text, которое является строкой.@Denis_Romanov, Спасибо, поправил.