Каковы ключевые шаги и best practices при создании проекта на FastAPI

«Каковы ключевые шаги и best practices при создании проекта на FastAPI» — вопрос из категории Библиотеки и модули, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Создание проекта на 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() для создания кастомных обработчиков исключений. Это позволяет возвращать клиенту осмысленные и стандартизированные ответы об ошибках.