FastAPI: Pydantic для безопасного кода (Урок 3)

Библиотека Pydantic, поставляемая вместе с FastAPI, позволяет описывать типы данных, повышая безопасность и надёжность кода. В отличие от языков Java, C#, C++, где типы данных указываются явно, Python упрощает написание кода, но может приводить к ошибкам при неконтролируемом типе передаваемых данных.

Проблема отсутствия явного указания типов данных

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

Использование Pydantic для описания типов данных

Pydantic решает проблему описания типов данных. Рассмотрим описание сложных структур данных, включая классы. В проекте, содержащем список постов, вместо простой проверки типа списка, можно указать точную структуру данных каждого элемента.

Описание структуры данных с помощью Pydantic

Импортируем класс BaseModel из библиотеки Pydantic:

from pydantic import BaseModel

Создадим класс Post, наследуемый от BaseModel, для описания структуры каждого поста:

class Post(BaseModel):
    id: int
    title: str
    body: str

Функция read_items будет возвращать список объектов класса Post:

from typing import List

# ... остальной код ...

@app.get("/items/")
async def read_items():
    return [Post(id=1, title="Foo", body="Bar")]

Преобразование данных в объекты Pydantic

Прямое преобразование списка словарей в список объектов Pydantic невозможно. Необходимо преобразовать каждый элемент списка:

Длинный вариант:

def read_items():
    post_objects = []
    for post in posts:
        post_objects.append(Post(id=post["id"], title=post["title"], body=post["body"]))
    return post_objects

Краткий вариант:

def read_items():
    return [Post(**post) for post in posts]

Оба варианта идентичны по функциональности, но второй более компактен.

Проверка структуры данных

Pydantic проверяет соответствие возвращаемых данных указанной структуре. Несоответствие вызовет исключение, гарантируя целостность данных и предотвращая ошибки.

Модификация функций

Функции Items, Item и Search модифицируются для возврата данных в соответствии с описанной структурой, используя класс Post. Функция Search возвращает словарь, где ключ – строка (дата), а значение – необязательный объект Post или None. Для этого используем Optional из typing и класс dict из Pydantic.

Добавление поля «Автор»

Добавим в класс Post поле author:

class User(BaseModel):
    id: int
    name: str
    age: int

class Post(BaseModel):
    id: int
    title: str
    body: str
    author: User

Теперь каждый пост будет содержать информацию об авторе.

Pydantic позволяет создавать более надёжные и безопасные приложения FastAPI, обеспечивая проверку типов и структуры данных, упрощая отладку и предотвращая ошибки. Использование Pydantic повышает качество кода и делает его более предсказуемым.

Что будем искать? Например,программа