FastAPI с Clean Architecture
«Домен не должен знать про 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 / 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 БУДУТ ТУТ
Другие доклады митапа
- ССMicroPython — искусство малых форм Сергей Степанов
- ЕДКак работает стартап на миллиард долларов Ерзат Дулат
- ЭСМикросервисы во Freedom Travel Эдуард Сидиропуло























