Как начать новый проект на FastAPI?

Ответ

Начало работы над проектом с FastAPI включает несколько ключевых этапов, направленных на создание масштабируемой, поддерживаемой и тестируемой архитектуры. Мой подход включает:

  1. Инициализация проекта и установка зависимостей: Устанавливаю FastAPI и Uvicorn (ASGI-сервер) в виртуальное окружение для изоляции зависимомостей проекта:

    python -m venv venv
    source venv/bin/activate # или `venvScriptsactivate` для Windows
    pip install fastapi uvicorn[standard] # uvicorn[standard] включает httptools и watchfiles для лучшей производительности и перезагрузки
    pip install pydantic # Pydantic часто идет как зависимость FastAPI, но явно указать не помешает
  2. Проектирование структуры проекта: Создаю логически разделенную структуру для модульности, удобства разработки и масштабирования. Это позволяет легко управлять компонентами и упрощает командную работу.

    project/
    ├── venv/               # Виртуальное окружение
    ├── app/                # Основное приложение
    │   ├── __init__.py
    │   ├── main.py         # Главная точка входа FastAPI приложения
    │   ├── api/            # Директория для роутеров (APIRouter)
    │   │   ├── __init__.py
    │   │   └── v1/         # Версионирование API (опционально, для больших проектов)
    │   │       ├── __init__.py
    │   │       └── endpoints.py # Файлы с эндпоинтами
    │   ├── models/         # Pydantic модели для валидации данных и сериализации
    │   │   ├── __init__.py
    │   │   └── schemas.py
    │   ├── crud/           # Операции Create, Read, Update, Delete (для взаимодействия с БД)
    │   │   ├── __init__.py
    │   │   └── users.py
    │   ├── database.py     # Конфигурация подключения к базе данных (SQLAlchemy, asyncpg и т.д.)
    │   ├── dependencies.py # Общие зависимости (например, получение сессии БД, аутентификация)
    │   └── config.py       # Настройки приложения (через Pydantic BaseSettings)
    ├── tests/              # Директория для тестов (pytest)
    ├── .env                # Переменные окружения
    └── requirements.txt    # Список зависимостей
  3. Создание базового приложения и первого эндпоинта: Определяю основной экземпляр FastAPI и простой эндпоинт для проверки работоспособности и демонстрации структуры.

    # app/main.py
    from fastapi import FastAPI
    from .api.v1 import endpoints # Пример импорта роутеров
    
    app = FastAPI(title="My FastAPI Project", version="1.0.0", description="A simple FastAPI application.")
    
    # Подключение роутеров для организации API
    app.include_router(endpoints.router, prefix="/api/v1", tags=["v1"])
    
    @app.get("/", tags=["Root"])
    async def read_root():
        return {"message": "Welcome to FastAPI!"}
    # app/api/v1/endpoints.py
    from fastapi import APIRouter
    
    router = APIRouter()
    
    @router.get("/items/")
    async def read_items():
        return [{"item_id": 1, "name": "Example Item"}]
  4. Запуск сервера разработки: Использую Uvicorn для запуска приложения в режиме разработки с автоматической перезагрузкой при изменениях в коде.

    uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

Далее следует интеграция ключевых компонентов:

  • Pydantic модели для строгой валидации входящих и исходящих данных, что обеспечивает надежность API.
  • Подключение к БД (например, с помощью SQLAlchemy Core/ORM или Tortoise ORM) и реализация CRUD-операций через слой crud/.
  • Обработка ошибок и создание кастомных исключений для предоставления информативных ответов клиентам.
  • Аутентификация и авторизация (например, с помощью JWT или OAuth2) для защиты эндпоинтов.
  • Написание тестов с использованием pytest и TestClient FastAPI для обеспечения надежности и корректности работы кода.