В этом модуле мы узнаем как эффективно структурировать приложение FastAPI, интегрировать его с Postgres через SQLAlchemy 2.0. Проект всегда должен быть гибким и масштабируемым в случае появления дополнительных функций и требований.
Что такое «чистая архитектура»
При разработке ПО на выходе мы хотим получить гибкую и масштабируемую систему, обладающую следующими признаками:
-
Независимость от фреймворков.
-
Возможность изолированного тестирования различных слоев приложения.
-
Независимость от реализации пользовательского интерфейса.
-
Изолированность бизнес‑логики от других слоев приложения.
Для достижения разделения ответственности используется правило Зависимостей. Данную концепцию предложил Роберт Мартин в 2012 г в статье «The Clean Architecture». Ниже приведена оригинальная схема из данной статьи:
Основное правило при таком архитектурном подходе гласит: Зависимости могут быть направлены только внутрь. Таким образом каждый внутренний круг системы ничего не знает о внешнем. Круг состоит из 4 слоев.
Внешний круг — это БД и фреймворки. Данный слой, как правило не содержит много кода, и никаким образом не должен влиять на имплементацию бизнес‑логики.
Далее идет слой интерфейсов‑адаптеров, он отвечает за преобразование данных в более удобный формат для исполнения сценариев. Он выступает «мостом» между внешним слоем и слоем бизнес‑логики приложения.
Следующий слой Сценарии предназначен для имплементации бизнес‑логики. Он инкапсулирует все случаи использования системы. Изменения во внешних слоях не должны затрагивать слой сценариев. Мы также ожидаем, что изменения в в этом слое не отразиться на слое Сущностей.
Слой сущности это минимальная единица с чем работает приложение. Она определяется бизнес‑правилами предприятия. Это может быть модель данных, объекты с методами, набор структур или отдельные функции.
Рассмотрим подобную структуру. Приложение состоит из четырех пакетов, которые предлагают функциональность, связанную с обслуживанием: маршрутизаторы, сервисы, схемы и модели. Чтобы внедрить новый функционал, необходимо добавить новый модуль в каждый из этих пакетов.
.
└── app/
├── backend/ # Функциональность и конфигурации бэкэнда
| ├── config.py # Настройки конфигурации
│ └── session.py # Менеджер сеансов базы данных
├── models/ # SQLAlchemy модели
│ ├── user.py # Модель пользователя
| ├── products.py # Модель товара
| └── ...
├── routers/ # API пути
| ├── auth.py # Авторизация
│ └── ...
├── schemas/ # Pydantic модели
| ├── auth.py
│ └── ...
├── services/ # Различная бизнес логика
| ├── auth.py # Создание пользователя, генерация и проверка токенов
| ├── base.py # Базовые классы, миксины
│ └── ...
└── main.py # Основной файл приложения
В этой структуре папка маршрутизаторов(routers) служит уровнем взаимодействия пользовательского интерфейса (UI).
models предоставляет сопоставления SQLAlchemy, которые устанавливают взаимосвязь между объектами базы данных и классами Python, в то время как shemas представляет сериализованные модели данных (Pydantic модели), которые используются во всем приложении и в качестве объектов ответа.
Папка backend предоставляет менеджер сеансов базы данных и класс конфигурации приложения. В сценариях, когда приложение взаимодействует не только с базой данных, но и с другими бэкендами, такими как дополнительные API, соответствующие файлы могут быть размещены в пакете backend.
Основной модуль main.py представляет точку входа FastAPI и инициирует объект приложения (экземпляр класса FastAPI).
Давайте в следующих шагах и разделах этого курса мы постепенно начнем создавать скелет нашего приложения.