
Примеры приведенные ниже, подсказывают как можно организовать структуру проекта FastAPI.
Так же предложен вариант использования паттернов Dependency Injection и Unit of Work. Принцип заключается в том, чтобы разделить логику и код на слои.
Что позволит иметь: - более поддерживаемую и понятную структуру проекта - масштабирование и переиспользование кода - возможность тестирования отдельных частей проекта
Контроллеры мы можем называть по разному: routers, endpoints, controllers.
Контроллеры отвечают за запрос\ответ. Можно сказать что они должны быть "тупые", не иметь бизнес-логики.
Они вызывают нужные зависимости: авторизация, проверка прав и т.д. Передают данные в сервис. Обрабатывают
HttpExceptions.
Нужно использовать зависимости (Depends) так как они кешируются.
Зависимости можно использовать повторно несколько раз — FastAPI по
умолчанию кэширует результат зависимости в пределах области запроса, т.е. если у нас есть зависимость,
которая вызывает сервис, мы не будем посещать БД каждый раз, когда вызываем эту
зависимость — только первый вызов функции.
Зная это, мы можем легко разделить зависимости на несколько более мелких функций, которые работают в меньшем домене и легче повторно использовать в других маршрутах.
Сервис отвечает за бизнес логику и взаимодействуют с репозиторием.
Если в пределах одной сессии (в нашем случае SqlAlchemy) нужно взаимодействовать с несколькими репозиториями, то следует использовать Unit of Work.
Репозиторий — это коллекция, которая содержит сущности, может фильтровать и возвращать результат обратно, в зависимости от требований нашего приложения. Где и как он хранит эти объекты, является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.
В нашем случае репозиторий может взаимодействовать с базой данных, например Postgres, Redis, MongoDB.
Если сказать просто, UoW это класс, который объединяет репозитории.
Паттерн Unit of Work помогает упростить работу с различными репозиториями и дает уверенность, что все репозитории будут использовать один и тот же DbContext.
Так же использование паттерна Репозиторий и UoW позволяет создать правильную структуру для развертывания приложения и внедрения DI, которые как минимум помогают в тестировании проекта.
Приложение (app) - отдельная часть логики проекта. Содержит свои контроллеры, сервисы, репозитории, зависимости, модели, exceptions и т.д.
Структура проекта, где файлы разбиты по приложениям проекта. - Пример
├── migrations/
├── src
│ ├── config/
│ │ ├── database
│ │ │ ├── db_config.py
│ │ │ └── db_helper.py
│ │ └── project_config.py
│ ├── support # app
│ │ ├── support_controller.py
│ │ ├── support_schema.py
│ │ ├── dependencies.py
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ ├── support_repository.py
│ │ ├── support_service.py
│ └── user # app
│ ├── routes.py
│ └── main.py
├── tests/
│ ├── users
│ └── support
├── pyproject.toml или requirements.txt
├── .env
├── .gitignore
├── logging.ini
└── alembic.ini
$ claude mcp add fastapi_base \
-- python -m otcore.mcp_server <graph>