Валидация данных с помощью Pydantic
FastAPI использует библиотеку Pydantic для валидации данных. Создайте Pydantic-модель с атрибутами и их типами для валидации входящих данных.
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str
price: float
Обработка ошибок валидации
Если входящие данные не соответствуют ожидаемым типам, FastAPI автоматически возвращает ответ с кодом 422 и информацией об ошибке.
Создание пользовательских ошибок
Для создания пользовательских ошибок используйте исключения. Создайте исключение и возбудите его с помощью raise
, если в коде возникает условие ошибки.
from fastapi import HTTPException
def check_item(item: Item):
if item.price < 0:
raise HTTPException(status_code=400, detail="Price must be greater than zero")
Обработка пользовательских ошибок в роутах
В роутере оберните код в блок try
и except
для обработки пользовательских ошибок. Если возникает исключение, верните его с заданным статус-кодом и сообщением.
@app.post("/items/")
async def create_item(item: Item):
try:
check_item(item)
except HTTPException as error:
return JSONResponse(status_code=error.status_code, content={"detail": error.detail})
Переопределение обработчиков ошибок
Для переопределения стандартных обработчиков ошибок или создания обработчиков для пользовательских исключений используйте декоратор @app.exception_handler()
.
from fastapi import Request
from fastapi.responses import JSONResponse
@app.exception_handler(HTTPException)
async def custom_http_exception_handler(request: Request, exc: HTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"custom_message": "An error occurred", "detail": exc.detail},
)
Использование пользовательских исключений
Создайте собственные классы исключений, наследуя их от базового класса Exception
или HTTPException
. Это позволяет использовать пользовательские исключения в вашем коде, сохраняя контроль над структурой ответа и статус-кодами.
class CustomException(HTTPException):
def __init__(self, status_code: int, detail: str):
super().__init__(status_code=status_code, detail=detail)
def check_item(item: Item):
if item.price < 0:
raise CustomException(status_code=400, detail="Price must be greater than zero")