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

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

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

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

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

Moscow Python Meetup
PRO

January 24, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Александр Шишенко
    PGK Digital
    Как мы с FastAPI
    на Django
    перешли

    View Slide

  2. Александр Шишенко
    В IT с 2011 года
    Руководитель команды
    разработчиков (тимлид)
    2

    View Slide

  3. ПГК ДИДЖИТАЛ
    3
    Создаем цифровые продукты
    для логистики: наши решения
    удобны для клиентов и помогают
    выстраивать логистику внутри
    компании
    Компания специализируется
    на разработке и внедрении
    цифровых продуктов и ПО
    для клиентских и внутренних
    IT-решений
    Наш портфель насчитывает
    свыше 150 IT и цифровых
    проектов

    View Slide

  4. Back in April 2022…

    View Slide

  5. Процесс разработки новых проектов
    5
    Прототип
    • Команда
    прототипирования
    MVP
    • Продуктовая
    команда
    Развитие и
    поддержка
    • Продуктовая
    команда
    Я тут

    View Slide

  6. Итак, с чем будем работать…
    6
    • Прототип на FastAPI
    • SQLAlchemy ORM
    • Три базы: Postgres, MSSQL, Oracle
    • Микросервисная архитектура (подразумевается)

    View Slide

  7. 7
    Архитектура – это всего лишь
    инструмент, и его нужно подбирать
    под задачу.

    View Slide

  8. View Slide

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

    View Slide

  10. Итак, с чем будем работать…
    10
    • Прототип на FastAPI
    • SQLAlchemy ORM
    • Три базы: Postgres, MSSQL, Oracle
    • Микросервисная архитектура (подразумевается)

    View Slide

  11. 11
    — норм!
    лёгкий удобный
    слишком , но не всегда

    View Slide

  12. — ок, но…
    12
    • Слишком слабая интеграция с FastAPI.
    • Нужно описывать одни и те же данные дважды: в Pydantic и
    SQLAlchemy ORM.
    • Сортировка, пагинация, фильтры – всё руками.
    • Постоянно таскать за собой engine или городить костыли.

    View Slide

  13. 13
    Ура, переписываем!!

    View Slide

  14. Начнём с ORM
    14
    • SQLModel
    • TortoiseORM
    • Gino

    View Slide

  15. 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

    View Slide

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

    View Slide

  17. 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')

    View Slide

  18. 18
    Инструменты миграций

    View Slide

  19. Alembic
    19
    • Строит граф миграций
    • Автогенерация миграций (с переменным успехом)
    • Работает поверх SQLAlchemy
    Хороший мигратор… для Алхимии

    View Slide

  20. aerich
    20
    • Работает с TortoiseORM
    • Не поддерживает миграции данных (только DDL)
    • Не умеет создавать миграции по изменениям моделей
    Слабоват
    (аэрих) (аэрич) (эрих)

    View Slide

  21. Liquibase
    21
    • Java
    • Не интегрирован в экосистему Python
    • Миграции в XML…
    Слишком сложный

    View Slide

  22. 22
    Ок, а что по админкам?

    View Slide

  23. SQLAlchemy Admin (sqladmin)
    23
    • Не имеет встроенного механизма авторизации
    (об LDAP говорить не приходится)
    • Слабо кастомизируема
    • Долго и дорого дорабатывать

    View Slide

  24. FastAPI-admin
    24
    • Сделан на Tabler UI
    • Есть разделение на Free и Pro версии (тревожный
    звоночек!)
    • В бесплатной версии нет управления правами и S3
    • Тоже слабая в плане кастомизации

    View Slide

  25. Jet Admin
    25
    • Очень мощный и кастомизируемый
    • SaaS…
    SaaS

    View Slide

  26. 26
    Проблемы везде

    View Slide

  27. 27
    $ poetry add django

    View Slide

  28. Django
    28
    • «Батарейки в комплекте»
    • Решает проблемы с базой, миграциями и админкой
    • REST API (DRF), управление пользователями, вебсокеты (channels), капча
    • Гигантское количество компонентов для решения (практически) любых задач
    Хороший инструмент для решения типовых задач

    View Slide

  29. 29
    переходим на Django

    View Slide

  30. Начинаем с ORM
    30
    • $ django-admin startproject project .
    • $ django-admin startapp app
    • Добавить django.setup()
    Переписать модели и все вызовы
    к ним с Алхимии на Django
    Сделать «фейковую» миграцию

    View Slide

  31. Какое-то время жили так
    31
    FastAPI
    API
    Django
    ORM +
    Миграции

    View Slide

  32. Потом добавили роутер и админку
    32
    Starlette Router (ASGI)
    FastAPI
    (/v1)
    API
    Django (/admin)
    ORM +
    Миграции
    Админка
    Starlette
    StaticFiles
    (/static)
    + Django Channels
    dev server (Daphne)

    View Slide

  33. Начали переписывать 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

    View Slide

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

    View Slide

  35. Мы полностью перешли на Django
    35
    • Мы получили огромную базу переиспользуемых компонентов
    • Админка досталась нам «бесплатно» с ORM
    • Мы не отказываемся от FastAPI во вспомогательных
    микросервисах
    • Разработка ускорилась в ~2.5 раза

    View Slide

  36. Выводы
    36
    Не надо гнаться за модой
    Принимайте решение из:
    • Технических особенностей
    • Количества кандидатов на рынке труда
    • Потребностей бизнеса

    View Slide

  37. НАШИ СТРАНИЦЫ В СОЦСЕТЯХ
    И НА СПЕЦИАЛИЗИРОВАННЫХ ПЛОЩАДКАХ
    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-канал
    Александр Шишенко
    Руководитель команды
    разработчиков (тимлид)

    View Slide