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

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

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

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

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

Avatar for Moscow Python Meetup

Moscow Python Meetup PRO

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-канал Александр Шишенко Руководитель команды разработчиков (тимлид)