FastAPI с Clean Architecture

Almaty Python Meetup #6

КУ
Коспан Улан
Investlink

«Домен не должен знать про FastAPI и SQLAlchemy» — звучит красиво, но как это выглядит в реальном коде, а не на диаграмме с кругами? Чистая архитектура часто остаётся теорией, пока не увидишь, как направление зависимостей читается прямо по импортам модулей.

Коспан Улан — Middle Backend Developer из Investlink — на примере пет-проекта Qozgalys (сервис генерации GPS-маршрутов по заданной картинке) показывает, как разложить приложение по слоям так, чтобы фреймворки и БД можно было менять без боли.

В докладе: — разбор слоёв domain, application, adapters и presentation и почему каждый зависит только от внутреннего — принципы DIP и IoC: инверсия зависимостей через interactor_factory и ioc.py — один набор интеракторов на три клиента — miniapp, telegram_bot и web_api — где меняются только фреймворк и способ авторизации (IdProvider) — реализация adapters: SQLAlchemy с миграциями и маппером, UoW, разные типы авторизации, генератор маршрута Qozgalys Core — контракты между слоями через DTO и гейтвеи (user_gateway, route_generator_gateway, source_image_gateway) — почему сессия БД открывается на каждый вызов интерактора и как устроен слой компоновки на FastAPI и Aiogram

Презентация

Слайд 1: ЧИСТАЯ 1 / 26
Текст презентации

Слайд 1: ЧИСТАЯ

ЧИСТАЯ АРХИТЕКТУРА НАПРИМЕРЕПЕТПРОЕКТА KOSPAN ULAN QOZGALYS

Слайд 2: QOZGALYS

QOZGALYS СЕРВИСДЛЯГЕНЕРАЦИИGPS- МАРШРУТОВПОЗАДАННОЙКАРТИНКЕ

Слайд 3: ОЧЕМБУДЕМГОВОРИТЬ?

ОЧЕМБУДЕМГОВОРИТЬ? ЧИСТАЯАРХИТЕКТУРА DIP ДЕТАЛЬНОПОСЛОЯМ QOZQALYS IOC НАПРАВЛЕНИЕЗАВИСИМОСТЕЙ Q&A СТРУКТУРАПРОЕКТА

Слайд 4: ЗАЧЕМНУЖНА

ЗАЧЕМНУЖНА ЧИСТАЯ АРХИТЕКТУРА?

Слайд 5: СУЩНОСТИ

СУЩНОСТИ НЕЗАВИСИТНИОТЧЕГО ЧИСТАЯБИЗНЕС-ЛОГИКА БЕЗЗНАНИЯФРЕЙМВОРКАХ,БДИТ.Д. Тут лежат: Сущности (Entities) Доменные ошибки Доменные сервисы и тд ENTITIES

Слайд 6: СЦЕНАРИИ

СЦЕНАРИИ ЗАВИСИТТОЛЬКООТDOMAIN Тут лежат: Use Cases / Interactors ENTITIES USECASES

Слайд 7: ИНТЕРФЕЙСАДАПТЕРЫ

ИНТЕРФЕЙСАДАПТЕРЫ Тут лежат: DTO (Input/Output models) Интерфейсы для внешних зависимостей ENTITIES INTERFACES USECASES

Слайд 8: ФРЕЙМВОРКИДРАЙВЕРА

ФРЕЙМВОРКИДРАЙВЕРА ЗДЕСЬВСЕДЕТАЛИ Тут лежат: Детали реализации для: ДБ (с миграциями и маппером) IdProvider (auth) Хранилища и для фреймворков: FastAPI Aiogram ADAPTERS/INFRASTRUCTURE ENTITIES USECASES INTERFACES ADAPTERS/FRAMEWORKS FRAMEWORKS/WEB

Слайд 9: Каждый слой зависит только от внутреннего

Каждый слой зависит только от внутреннего Фреймворки и БД можно менять без боли Домен не должен знать про FastAPI и SQLAlchemy Высокоуровневая логика не зависит от деталей реализации ВИТОГЕ

Слайд 10: КАКЭТО

КАКЭТО B QOZGALYS?

Слайд 11: MAIN

MAIN ENTRYPOINTПРИЛОЖЕНИЯ Все настройки происходят здесь: и для веба, и для телеграма Не считается как слой Сессия дб открывается на каждый вызов интерактора СЛОЙКОМПОНОВКИ main ioc.py config.py bot.py web.py presentation domain application adapters

Слайд 12: MAIN IOC.PY WEB.PY

MAIN IOC.PY WEB.PY

Слайд 13: PRESENTATION

PRESENTATION Интерфейс для IoC тут; Здесь же реализован апи для 3х разных клиентов, но все используют одни и те же интеракторы, меняется только детали: Фреймворк и способ авторизации (IdProvider) presentation miniapp telegram_bot web_api interactor_factory.py

Слайд 14: PRESENTATION

PRESENTATION ДЛЯAIOGRAM ДЛЯFASTAPI

Слайд 15: APPLICATION

APPLICATION Интеракторы реализованы тут Они имеют контракты с представлениями (DTO’s) и адаптерами(interfaces-gateways); И здесь происходит связь между доменом и со всей остальной частью кода. application authenticate.py get_list_images.py upload_image.py generate_route.py

Слайд 16: APPLIC ATION

APPLIC ATION GET_LIST_IMAGES.PY GENERATE_ROUTE.PY

Слайд 17: APPLICATION.COMMON Все интерфейсы/гейтвеи находятся тут

APPLICATION.COMMON Все интерфейсы/гейтвеи находятся тут common user_gateway.py route_generator_gateway.py uow.py id_provider.py application

Слайд 18: SOURCE_IMAGE_GATEWAY.PY UOW.PY

SOURCE_IMAGE_GATEWAY.PY UOW.PY APPLICA TION

Слайд 19: ADAPTERS

ADAPTERS Здесь лежат реализация Алхимии (вместе с миграциями), разные типы авторизации и генератор роута (Qozgalys Core) auth telegram_auth.py token.py adapters database mappings.py sqlalchemy.py sqlalchemy_uow.py user_db.py migrations route_generator INFRASTRUCTURE

Слайд 20: ADAPT ERS

ADAPT ERS AUTH/TELEGRAM_AUTH.PY AUTH/TOKEN.PY DATABASE/USER_DB.PY

Слайд 21: DOMAIN

DOMAIN Здесь у нас бизнес логика или бизнес сущности с методами. services artwork.py source_image.py domain models artwork.py user.py exceptions

Слайд 22: DOMA IN

DOMA IN MODELS/ARTWORK.PY SERVICES/ARTWORK.PY

Слайд 23: MAIN PRESENTATION

MAIN PRESENTATION APPLICATION DOMAIN ADAPTERS APP.../COMMON Направлениезависимостей

Слайд 24: РЕЗЮМЕ

РЕЗЮМЕ 1.ТАКАЯСТРУКТУРАПОМОГАЕТНЕТЕРЯТЬСЯВ СЛОЯХ,НАПРАВЛЕНИЕЗАВИСИМОСТЕЙМОЖНО УВИДЕТЬДАЖЕЧЕРЕЗИМПОРТЫМОДУЛЯ 2.КАЖДЫЙСАМРЕШАЕТНУЖНОЛИПРИМЕНИТЬ

Слайд 25: KOSPANULAN

KOSPANULAN MIDDLE BACKEND DEVELOPER [email protected]

Слайд 26: СПАСИБО

СПАСИБО ЗАВНИАМНИЕ НОВОСТИ О QOSGALYS БУДУТ ТУТ

Другие доклады митапа