Некоректні дані, що потрапляють у бекенд, — це не просто головний біль, а потенційний витік грошей та репутації. Розробники часто недооцінюють важливість валідації, що призводить до помилок у продакшені та витрати часу на їх виправлення.
Контекст і чому це важливо
FastAPI та Pydantic роблять валідацію даних набагато зручнішою, але й тут легко припуститися помилок. Особливо це стосується складних моделей даних, де потрібні валідації на рівні списків, вкладених об’єктів та залежностей між полями.
Ігнорування валідації або її неповна реалізація може призвести до SQL-ін’єкцій, XSS-атак, некоректної логіки бізнесу та, як наслідок, до зниження довіри користувачів. Наприклад, невалідований email може призвести до потрапляння скомпрометованих даних у вашу базу даних.
Практична реалізація
Створення моделей даних з Pydantic дозволяє визначати типи даних, необхідні валідації та навіть перетворювати дані при їх отриманні. Ось приклад валідації даних користувача з обов’язковим поштою, віком від 18 років та перевіркою формату email.
from pydantic import BaseModel, validator, EmailStr
from datetime import date
class User(BaseModel):
name: str
email: EmailStr
birthdate: date
age: int
@validator('age')
def age_must_be_valid(cls, value):
if value < 18:
raise ValueError('Вік має бути не менше 18 років')
return value
model_config = {
'validate_assignment': True
}
Цей код визначає модель `User`, яка включає перевірку формату email за допомогою `EmailStr`, мінімальний вік за допомогою декоратора `@validator` та налаштування `validate_assignment` для перевірки при присвоєнні значень. Використання `EmailStr` автоматично перевіряє, чи введений email має правильний формат.
Поширені помилки та підводні камені
- Нехтування `validate_assignment`: Без цього налаштування, Pydantic валідує лише при створенні об’єкта. Зміни в існуючих об’єктах не перевіряються, що може призвести до несподіваних помилок.
- Складні валідації без перевірки на помилки: Забування перевірки на `ValueError` після валідації може призвести до непередбачуваної поведінки API. Важливо перехоплювати помилки та повертати клієнту інформативні повідомлення.
- Валідація списків та вкладених об’єктів: Часто забувають валідувати елементи списків або поля вкладених об’єктів. Це може призвести до несподіваних проблем з даними, що зберігаються в базі даних.
Порівняння підходів
Раніше, валідація часто робилася вручну в коді, використовуючи `if` оператори та регулярні вирази. Це було громіздко, важко в підтримці та схильне до помилок. Наприклад, перевірка email вручну може зайняти 20-30 рядків коду.
Використання Pydantic дозволяє автоматизувати валідацію, зменшуючи обсяг коду та підвищуючи надійність. Перевірка email за допомогою `EmailStr` займає всього один рядок коду, а валідація структури даних описується декларативно в моделі.
Висновки
Pydantic є невід’ємною частиною FastAPI та значно спрощує валідацію даних. Завжди використовуйте моделі Pydantic для обробки даних, що надходять від клієнта. Почніть з визначення простих моделей з базовими перевірками, а потім поступово додавайте складніші валідації.