5.1 Структурирование FastAPI, APIRouter и написание моделей Pydantic
4 из 4 шагов пройдено

В этом модуле мы узнаем как эффективно структурировать приложение 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). 

Давайте в следующих шагах и разделах этого курса мы постепенно начнем создавать скелет нашего приложения.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.