Введение в Pydantic и секретные поля

Pydantic — популярная библиотека для создания моделей данных в Python. Она позволяет создавать структурированные и валидируемые данные, что делает ее идеальной для работы с API или веб-приложениями. Однако, когда вы работаете с секретными полями, часто возникает необходимость вывести их в явном виде для отладки, но сохранить их зашифроваными в ошибках валидации.

Создание секретного поля с помощью Pydantic

Чтобы создать секретное поле, мы можем использовать атрибут `exclude` в Pydantic. Этот атрибут позволяет нам исключить определенные поля из валидации и отображения. Однако, чтобы вывести секретное поле в явном виде для отладки, нам придется использовать другую стратегию.

Использование `model_dump()` для вывода секретного поля

`model_dump()` — это метод Pydantic, который позволяет нам вывести модель данных в явном виде. Мы можем использовать этот метод для вывода секретного поля в текстовом виде, но сохранить его зашифрованым в ошибках валидации. Чтобы сделать это, нам нужно создать отдельный метод, который будет вызываться после валидации, и вывести секретное поле в явном виде в этом методе.

Пример реализации секретного поля

from pydantic import BaseModel
from typing import Optional

class User(BaseModel):
    id: int
    email: str
    password: str  # Секретное поле
    secret_data: Optional[str] = None  # Поле для хранения секретной информации

    class Config:
        exclude = {"password"}  # Исключаем секретное поле из валидации и отображения

class UserValidator(User):
    def model_dump(self):
        data = super().model_dump()
        data["password"] = self.password  # Выводим секретное поле в явном виде в model_dump()
        return data

Использование примера

Теперь, когда мы вызываем `model_dump()` на экземпляре `UserValidator`, секретное поле будет выведено в явном виде:

validator = UserValidator(
    id=1,
    email="user@example.com",
    password="secret_password",
    secret_data="some_secret_data"
)

print(validator.model_dump())

Выводит:

{
    "id": 1,
    "email": "user@example.com",
    "password": "secret_password",
    "secret_data": "some_secret_data"
}

Заключение

В этой статье мы рассмотрели, как создать секретное поле в Pydantic, которое будет выведено в явном виде для отладки, но сохранить его зашифрованым в ошибках валидации. Это достигается с помощью метода `model_dump()` и создания отдельного класса для валидации.