Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MoscowPython Meetup №80 Александр Шишенко

MoscowPython Meetup №80 Александр Шишенко

Александр Шишенко (ПГК Digital, Руководитель группы разработки).

Мы переписали бекенд с FastAPI на Django. Расскажу, почему и как нам пришло это в голову, и что из этого получилось.

Moscow Python Meetup

January 24, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. ПГК ДИДЖИТАЛ 3 Создаем цифровые продукты для логистики: наши решения

    удобны для клиентов и помогают выстраивать логистику внутри компании Компания специализируется на разработке и внедрении цифровых продуктов и ПО для клиентских и внутренних IT-решений Наш портфель насчитывает свыше 150 IT и цифровых проектов
  2. Процесс разработки новых проектов 5 Прототип • Команда прототипирования MVP

    • Продуктовая команда Развитие и поддержка • Продуктовая команда Я тут
  3. Итак, с чем будем работать… 6 • Прототип на FastAPI

    • SQLAlchemy ORM • Три базы: Postgres, MSSQL, Oracle • Микросервисная архитектура (подразумевается)
  4. Определяемся с архитектурой 9 Микросервисы Монолит Масштабирование Независимое Всё вместе

    Оверхед на разработку хорошего протокола Есть Нет Деплой и откат Сложный Простой Мерж-конфликты Минимальны Частые Накладные расходы на RPC (CPU, RAM, сеть) Есть Нет Graceful degradation Есть Нет Поддержка разных языков/фреймворков для разных частей Есть Нет
  5. Итак, с чем будем работать… 10 • Прототип на FastAPI

    • SQLAlchemy ORM • Три базы: Postgres, MSSQL, Oracle • Микросервисная архитектура (подразумевается)
  6. — ок, но… 12 • Слишком слабая интеграция с FastAPI.

    • Нужно описывать одни и те же данные дважды: в Pydantic и SQLAlchemy ORM. • Сортировка, пагинация, фильтры – всё руками. • Постоянно таскать за собой engine или городить костыли.
  7. SQLModel 15 Плюсы: • Решает проблему дублирования схемы • Переписывать

    мало Минусы: • (наследует минусы SQLAlchemy) • Не поддерживает трансформации данных Слой совместимости SQLModel и Pydantic from sqlmodel import Field, SQLModel class Train(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str
  8. TortoiseORM 16 Плюсы: • Удобнее алхимии • Очень быстрый Минусы:

    • Несколько маргинален • Слабый движок миграций • Не получилось подключить базы через ODBC Делался под впечатлением от Django (и разработчики это не скрывают) from tortoise.models import Model from tortoise import fields class Train(Model): id = fields.IntField(pk=True) name = fields.TextField()
  9. GINO 17 Плюсы: • Хорошая интеграция с FastAPI Минусы: •

    Только Postgres • Пока недостаточно стабилен • Слабая документация • Нет готовых админок Делался под впечатлением от Django (и разработчики это скрывают) from gino import Gino db = Gino() class Train(db.Model): __tablename__ = 'trains' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.Unicode(), default='noname')
  10. Alembic 19 • Строит граф миграций • Автогенерация миграций (с

    переменным успехом) • Работает поверх SQLAlchemy Хороший мигратор… для Алхимии
  11. aerich 20 • Работает с TortoiseORM • Не поддерживает миграции

    данных (только DDL) • Не умеет создавать миграции по изменениям моделей Слабоват (аэрих) (аэрич) (эрих)
  12. Liquibase 21 • Java • Не интегрирован в экосистему Python

    • Миграции в XML… Слишком сложный
  13. SQLAlchemy Admin (sqladmin) 23 • Не имеет встроенного механизма авторизации

    (об LDAP говорить не приходится) • Слабо кастомизируема • Долго и дорого дорабатывать
  14. FastAPI-admin 24 • Сделан на Tabler UI • Есть разделение

    на Free и Pro версии (тревожный звоночек!) • В бесплатной версии нет управления правами и S3 • Тоже слабая в плане кастомизации
  15. Django 28 • «Батарейки в комплекте» • Решает проблемы с

    базой, миграциями и админкой • REST API (DRF), управление пользователями, вебсокеты (channels), капча • Гигантское количество компонентов для решения (практически) любых задач Хороший инструмент для решения типовых задач
  16. Начинаем с ORM 30 • $ django-admin startproject project .

    • $ django-admin startapp app • Добавить django.setup() Переписать модели и все вызовы к ним с Алхимии на Django Сделать «фейковую» миграцию
  17. Потом добавили роутер и админку 32 Starlette Router (ASGI) FastAPI

    (/v1) API Django (/admin) ORM + Миграции Админка Starlette StaticFiles (/static) + Django Channels dev server (Daphne)
  18. Начали переписывать API по одному методу 33 Starlette Router (ASGI)

    FastAPI (/v1) API (старое) Django (/admin, /v1/method1, /v1/method2, …) ORM + Миграции Админка API DRF (новое) Starlette StaticFiles (/static) + Django Channels dev server (Daphne) Можно было использовать djantic
  19. Убрали FastAPI 34 Starlette Router (ASGI) Django (/admin, /v1/method1, /v1/method2,

    …) ORM + Миграции Админка API DRF (новое) Starlette StaticFiles (/static) + Django Channels dev server (Daphne)
  20. Мы полностью перешли на Django 35 • Мы получили огромную

    базу переиспользуемых компонентов • Админка досталась нам «бесплатно» с ORM • Мы не отказываемся от FastAPI во вспомогательных микросервисах • Разработка ускорилась в ~2.5 раза
  21. Выводы 36 Не надо гнаться за модой Принимайте решение из:

    • Технических особенностей • Количества кандидатов на рынке труда • Потребностей бизнеса
  22. НАШИ СТРАНИЦЫ В СОЦСЕТЯХ И НА СПЕЦИАЛИЗИРОВАННЫХ ПЛОЩАДКАХ https://pgk.ru 105066,

    Москва, ул. Новорязанская, 24 +7 495 663 01 01 8 800 775 16 16 [email protected] Хабр НАШИ СТРАНИЦЫ В СОЦСЕТЯХ И НА СПЕЦИАЛИЗИРОВАННЫХ ПЛОЩАДКАХ https://pgk.ru 105066, Москва, ул. Новорязанская, 24 +7 495 663 01 01 8 800 775 16 16 [email protected] Хабр @gamepad64 Мой YouTube-канал Александр Шишенко Руководитель команды разработчиков (тимлид)