FastAPI использует Pydantic для валидации и сериализации данных, что позволяет создавать более надежные и безопасные приложения. Pydantic — это библиотека Python для работы с данными, которая позволяет определять модели данных с помощью аннотаций типов.
Определение модели данных
Перед использованием Pydantic необходимо определить модель данных. Модель данных — это описание структуры данных с помощью аннотаций типов. В FastAPI модель данных может быть определена внутри пути, операции или в отдельном файле.
Пример определения модели данных внутри пути:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
async def create_item(item: Item):
return item
В этом примере мы определяем модель данных Item, которая имеет поля name, price и is_offer. Затем мы определяем операцию create_item, которая принимает объект Item в качестве аргумента. FastAPI автоматически проверяет входные данные на соответствие модели данных и генерирует ошибку 422 Unprocessable Entity в случае несоответствия.
Валидация данных
Pydantic автоматически проверяет входные данные на соответствие модели данных и генерирует ошибку ValidationError в случае несоответствия. Ошибка содержит подробную информацию о том, какие поля не прошли валидацию.
Пример использования Pydantic для валидации данных:
from pydantic import BaseModel, ValidationError
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
try:
item = Item(name="Item", price="not a float")
except ValidationError as e:
print(e)
В этом примере мы пытаемся создать объект Item с неверным типом данных для поля price. Pydantic генерирует ошибку ValidationError и выводит сообщение об ошибке.
Сериализация данных
Pydantic также обеспечивает мощный механизм сериализации данных в JSON-формат. Модель данных, определенная с помощью Pydantic, может быть преобразована в словарь, который может быть легко сериализован в JSON.
Пример использования Pydantic для сериализации данных:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
item = Item(name="Item", price=10.0)
item_dict = item.dict()
В этом примере мы создаем объект Item и преобразуем его в словарь. Затем мы можем легко сериализовать словарь в JSON.
import json
json_item = json.dumps(item_dict)
Мы используем функцию json.dumps() для сериализации словаря в JSON.
Валидация запросов
FastAPI позволяет использовать модели данных Pydantic для валидации запросов и ответов. Модели данных могут использоваться для проверки типов параметров запроса, параметров пути, тела запроса и ответов.
Пример использования моделей данных Pydantic для валидации запросов:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
async def create_item(item: Item):
return item
В этом примере мы определяем модель данных Item, которая имеет поля name, price и is_offer. Затем мы определяем операцию create_item, которая принимает объект Item в качестве аргумента. FastAPI автоматически проверяет входные данные на соответствие модели данных и генерирует ошибку 422 Unprocessable Entity в случае несоответствия.
Валидация ответов
FastAPI также позволяет использовать модели данных Pydantic для валидации ответов. Модели данных могут использоваться для проверки типов возвращаемых значений и данных, которые должны быть включены в ответ.
Пример использования моделей данных Pydantic для валидации ответов:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
return item
В этом примере мы определяем модель данных Item, которая имеет поля name, price и is_offer. Затем мы определяем операцию create_item, которая принимает объект Item в качестве аргумента. Мы также указываем response_model для операции, чтобы FastAPI мог проверить тип возвращаемого значения и данные, которые должны быть включены в ответ.