Ответ
Создание проекта на FastAPI следует структурировать вокруг его ключевых возможностей: моделей данных Pydantic, инъекции зависимостей и асинхронности. Ниже приведены основные шаги и лучшие практики.
1. Валидация данных с помощью Pydantic
Всегда определяйте модели для входящих и исходящих данных. Это обеспечивает валидацию, преобразование типов и автоматическую генерацию документации.
from pydantic import BaseModel, Field
class ItemCreate(BaseModel):
name: str = Field(..., min_length=3, description="Название товара")
price: float = Field(..., gt=0, description="Цена должна быть положительной")
class ItemResponse(BaseModel):
id: int
name: str
2. Структурирование проекта с помощью APIRouter
Для проектов сложнее одного файла используйте APIRouter для разделения эндпоинтов на логические модули. Это улучшает читаемость и поддержку кода.
# /routers/items.py
from fastapi import APIRouter
router = APIRouter(
prefix="/items",
tags=["items"],
)
@router.get("/")
async def read_items():
return [{"name": "Item 1"}]
# /main.py
from fastapi import FastAPI
from .routers import items
app = FastAPI()
app.include_router(items.router)
3. Использование инъекции зависимостей (Depends)
Выносите повторяющуюся логику (например, подключение к БД, аутентификацию пользователя) в функции-зависимости. Это соответствует принципу DRY (Don't Repeat Yourself) и упрощает тестирование.
from fastapi import Depends, FastAPI
async def get_db_session():
# Логика получения сессии БД
db = ...
try:
yield db
finally:
db.close()
@app.get("/users/me")
async def read_current_user(db: Session = Depends(get_db_session)):
# работа с db
return {"user": "current"}
4. Асинхронная работа с базой данных и другими I/O
Используйте асинхронные драйверы для баз данных (asyncpg для PostgreSQL, motor для MongoDB) и HTTP-клиенты (httpx). Это позволяет вашему приложению эффективно обрабатывать большое количество одновременных запросов, не блокируя основной поток выполнения.
5. Управление конфигурацией
Не храните конфигурационные данные (ключи API, данные для подключения к БД) в коде. Используйте переменные окружения и библиотеки, такие как pydantic-settings, для их безопасной загрузки.
6. Централизованная обработка ошибок
Используйте декоратор @app.exception_handler() для создания кастомных обработчиков исключений. Это позволяет возвращать клиенту осмысленные и стандартизированные ответы об ошибках.