Решил я тут пофрилансить для души, и увидел, что каждый третий проект по разработке чат-бота предполагает интеграцию веб-админки. В основном это касается онлайн-магазинов, где заказчик пытается сэкономить на сайте и заменить его монстрючим чат-ботом. При этом рулить проектом ему удобнее в привычной среде. Отсюда и возникает пунктик — "хочу админку". Функциональность этой штуковины обычно заканчивается на обновлении информации о товарах, назначении админов, управлении рассылками... в общем, простые манипуляции с базой, не более. Так вот, дефолтный разработчик, видя этот пункт, берет, мать ее, Django. Почему? Ну конечно, причина кроется в лени колхозить свою админку, и притащить красивую Джанговую реализацию кажется хорошей идеей. Заказчик, в свою очередь, гуглит топ веб-фреймворков и одобрительно кивает на сей перфоманс. А иногда и подливает масла в огонь, прямо в описании работы тегая Django.

Гордый Telegram Developer с 10-летним стажем
Гордый Telegram Developer с 10-летним стажем

Ну что, мы разобрались с тем, откуда Django появляется в жизни счастливого и молодого ботодела, типа меня. Теперь посмотрим, что влечет этот хитрый мув.

Минусы интеграции Django:

  • Изначальная несовместимость фреймворков. Aiogram целиком работает на aiohttp и не тянет никаких синхронных зависимостей. То есть мы имеем плацдарм для реализации крутого fully-asynchronous проекта. И тянем, кхм, синхронный веб-фреймворк как важный (или не очень важный) микросервис.

  • Django ORM — главный минус, хоть и второй в списке. Первый был по большей части идеологический и смысловой, а этот уже про практику. Django ORM во всём уступает SQLalchemy. Она не умеет в асинхронность (аргументы про asgiref "sync_to_async" не принимаются), транзакции отключены по умолчанию, в целом медленная из-за ActiveRecord. Добавим, что использование этой ОРМ ограничено Джангой, и мигрировать при надобности вы будете, вероятно, с болью. В итоге мы имеем 2 пути: интегрировать 2 ОРМ сразу, что бред, или использовать только Джанговую, напрочь убивая весь смысл использования Aiogram.

  • Из пушки по воробьям (или как там в пословице говорится). Давайте не забывать, что Django — не только про ОРМ и админки. Это довольно монструозная зависимость с набором зачастую ненужных тебе тулзов. И не надо их тащить ради админки, ну пожалуйста. Не будет в твоем микросервисе ничего кроме ORM-запросов и view из сырого html. И эта (неудобная и странная) структура проекта Джанги будет лишь мешаться при разработке и масштабировании проекта.

Плюсы интеграции Django:

  • Не надо формошлепить — всё из коробки. 3 команды в терминале и рабочая админка готова. Формулируя короче: меньше действий для реализации MVP. На этом, пожалуй, плюсы закончились.

А как иначе?

У тебя 2 варианта.

- Убеждай и властвуй

Вариант, сразу предупрежу, маловероятный. Заключается в том, чтобы убедить заказчика, что админка ему в привычном понимании не нужна в принципе. Альтернативой предлагай интеграцию админки прямо в Telegram. Построить красивую и логичную админку на inline- и reply- кнопках можно, проверено на моем опыте. Для удобства работы со сложными меню, используй замечательный Aiogram Dialog.

Тут дам маленький совет.

Заказчик может сразу отвесить тебе оплеуху из консерватизма. И будет прав. Поэтому не поленись накидать MRE* и записать минутный скринкаст по использованию админки внутри Telegram. Шансы на успешное избежание в надобности целого веб-сервиса кратно растут. Я проверял.

*MRE — minimum reproducible example (минимально-воспроизводимый пример).

- Гордо поклонись

Если финт ушами из техники "Убеждай и властвуй" не прокатил, и веб-админку делать всё-таки придется, то воспользуйся нормальным инструментом, который подойдет по основным параметрам: легковесный (не в плане килобайт, а в количестве зависимостей), честно-асинхронный, легко интегрируемый и заменяемый на что-то другое. Короче, томить не буду, я настаиваю на FastAPI / Aiohttp (второй вообще из коробки с aiogram). Они тебе подойдут идеально. А сверстать 3 кнопки и таблицу на html займет от силы пару часов, поэтому серьезной проблемой это назвать нельзя.

Полезные материалы и ресурсы:

  • Темплейты для масштабируемых Telegram-Ботов: Шаблон Тишки (Tishka17), шаблон Карыча (мой), шаблон Юры (bomzheg).

  • Книга по Aiogram для начинающих (от Groosha).

  • Aiogram Dialog — без этой библиотеки тяжело глубокую навигацию по кнопкам делать.

  • Мой бложик, на котором есть примеры моих проектов и более короткие статьи, не соответствующие формату Хабра.

Комментарии (19)


  1. zueve
    27.07.2022 16:34
    +4

    По моему django-admin действительно крутой проект, возможно это самая лучшая часть django (еще мне нравятся миграции). И странно, но до сих пор нет вменяемых альтернатив (например для той же FastAPI), что бы можно так же легко и быстро создать админку. Всему конечно своя цена, и с ростом сложности, обходить костыли Django становится все сложнее. Но в чат админке ограничений намного больше


    1. RH215
      27.07.2022 16:52
      -1

      С одной стороны, да. С другой -- простой табличный вывод с шаблонизатором и фильтром реализуется за несколько часов. Джанга же нервов потреплет в сумме больше, чем на несколько часов.


      1. danilovmy
        30.07.2022 14:25

        Больше чем несколько часов - Это только если разработчик не знает django.contrib.admin ну и иже с ними django.utils, Django.views и в общем Django.contrib

        Я заточился именно на django.contrib.admin мои доклады по этой части Джанго есть на Ютубе, будет доклад на Django con EU 22, и Django con US 22. Мне видно, что автор статьи не очень понимает Django. Почти все, что в шаблонах, в моей команде мы правим через код. Шаблоны со времён правки ошибок в inlines.html для nested inline мы не трогаем. Дизайнер иногда касается css. Я к тому, что сложности в кастомизации админки только у тех, кто не понял как она работает. А таких, увы, очень много.


    1. devkarych Автор
      27.07.2022 16:59
      +4

      Согласен, я и указал в "плюсах", что Django-admin — классная вещь с точки зрения скорости развертывания. Но там первое слово — Django, и тащить весь фреймворк в проект просто из-за админки — решение почти всегда не лучшее.

      Кстати про FastAPI: я начал следить за проектом: https://github.com/fastapi-admin/fastapi-admin. Похоже, потихоньку развиваются альтернативы django-admin.


      1. mgis
        28.07.2022 10:20

        Думаю вопрос поддержки алхимии для fastapi-admin вопрос времени.


  1. akamoroz
    27.07.2022 17:12
    +8

    Я один из тех, кто использует aiogram + django admin and migration для MVP.

    По минусам в статье:

    • Изначальная несовместимость фреймворков – какая разница, когда aiogram и django все равно крутится каждый в своем docker и лежит в разных репах? Они выполняет разные функции и django может быть удален одной кнопкой, когда придет время для его удаления?
      Мы же не говорим что PostgeSQL и Redis несовместимые технологии - просто выполняют разные задачи.
      Из плюсов - все написано на Python, нам не нужен frontend разработчик.

    • Django ORM – У нас что, 1000 админов? Зачем нам асинхронная ORM в админке? Понятно, что пользователей бота может быть несколько десятков тысяч + сам интерфейс предполагает быстрое взаимодействие - там нужна скорость, а для админки зачем скорость?

    • Из пушки по воробьям – no comments. Не нужны forms, tests, views and caches - не используй, не нужны applications - положи все в одну папку. Джанго можно использовать не только как написано в Tutorial, а просто сделать проект на 5-7 файлов в одной папке, если структура БД небольшая.

    Дополнительный плюс:

    • Переодические задачи – если нужно раз в час что-то обновить, то periodiq + dramatiq отлично дружат с Django ORM и так же экономит время и деньги.


    1. akamoroz
      27.07.2022 17:44

      Из реальных минусов django admin не указан самый главный: отсутствие нормальной кастомизации.

      В реальной жизни первое время встречались кейсы, когда клиент не понимал почему я сделал такую красивую админку быстро, но не могу "перекрасить всего лишь кнопку".

      Теперь я говорю так: админку даю вам в подарок as-is и мы ее внешне не переделываем. Как только функционал бота будет более-менее стабилизирован, бизнес модель протестирована, то выделяем бюджет и делаем нормальную панель на FastAPI + Vue/Flutter/подставьте_свою_технологию с любым дизайном. Такой подход уже работает нормально.


      1. devkarych Автор
        27.07.2022 17:53

        Отличное дополнение. А почему бы не выкатывать сразу на стадии MVP нормальную админку под FastAPI? По требованиям заказчиков, какие я встречал, они все ± на одно лицо, и можно себе накидать базовый универсальный шаблон с UI на том же Vue.


        1. MrShandy
          27.07.2022 23:26

          А почему бы не выкатывать сразу на стадии MVP нормальную админку под FastAPI?

          Потому что ее еще нужно сделать, потратить некое количество времени (быстро и функционально вроде невозможно), а тут уже готовое.
          Как написали выше, админку можно прикрутить потом, когда все будет стабильно


    1. allburov
      29.07.2022 05:43

      А можно вопрос - в докер с aiogram для взаимодействия с БД что используете, Джанго ORM или что-то асинхронное?

      Просто Джанго орм же вроде синхронный полностью, получается блокируется весь луп пока ОРМ не выполнит запрос объектов. Или используете пул из синхронных экзекьютеров для этого?

      Сам столкнулся с такой проблемой и пока просто выбрал синхронный фреймворк для телеграмм, чтобы дружить с Джанкой, ни такие там рпс на ботов чтобы ассинхрогщину держать обычно.


  1. Nerevar_soul
    27.07.2022 23:04
    +1

    А чем aiogram лучше чем python-telegram-bot? Из-за того что python-telegram-bot пока только переезжает на asyncio?


    1. devkarych Автор
      27.07.2022 23:25
      +2

      1) Aiogram — полноценный фреймворк, а не просто обертка над API Telegram. Он очень похож на аналогичные backend-фреймворки. Тут из коробки FSM (Finite State Machine — она же машина состояний), фильтры, миддлвари. Aiogram — честно-асинхронный, т.к. под капотом aiohttp, asyncio.

      2) Комьюнити.

      2.1) Оно просто самое большое и активное. Все проблемы решили до Вас, и в тех же Telegram-чатах есть ответы на большинство из интересующих вас вопросов. А если нет, то Вам на них скорее всего ответят.

      2.2) Реализовано большое количество вспомогательных классных библиотек: упомянутый aiogram-dialog, fluentogram (обертка над встроенным механизмом i18n). Есть куча готовых темплейтов и примеров ботов на все случаи жизни со всеми "комбинациями" стеков.

      3) Развитие фреймворка. Скоро релиз 3-ей версии (сейчас она в beta), в которой появятся роутеры, приятные фичи и наконец-то хорошая документация. Полный список отличий от текущей версии можете найти на официальном сайте (aiogram.dev).

      4) Оперативные обновления с интеграцией новых версий BotAPI.

      5) Он очень хорош с точки зрения наличия документ-строк (докстрингов), подсказок типов (тайпхинтов), без которых программировать на питоне уже дискомфортно.


      1. Nerevar_soul
        28.07.2022 09:21

        Спасибо за подробный ответ! Думаю попробовать aiogram, как раз надо небольшого бота написать.

        python-telegram-bot тоже фреймворк. Полноценной FSM в нем нет, но какое-то подобие в виде ConversationHandler есть. И диалог с помощью него в принципе можно написать. Я как раз почему-то думал что aiogram небольшая библиотечка, основной плюс которой, то что он написан на asyncio. A python-telegram-bot здоровый фреймворк типа джанги, где есть куча всего


  1. n0cronix
    28.07.2022 10:41

    А почему не разнести просто эту историю на 2 микросервиса. Джанго в одном, классический бэк. Айограм в другом, по факту и бай дезайн - фронтенд.

    Есть даже проект в закрамах гитхаба с таким подходом и работает вполне сносно.


  1. chigiwar
    28.07.2022 12:08

    А почему бы просто не поднять сервис на DRF и путь aiogram по API работает с джангой. Таким образом у Вас будет разделена отвественность. aiogram взаимодействие с пользователем, логика в API. Более того методы API можно будет переиспользовать, если проект будет развиваться и понадовится нормальный фронт.


  1. Pongo
    28.07.2022 22:55

    Глянул шаблоны — нигде толком нет тестов. Неужели боты тестируются вручную?


    1. devkarych Автор
      29.07.2022 11:00

      Специфика чат-ботов в Telegram такова, что есть ограничение BotAPI — бот не может писать боту. По этой и многим другим причинам именно "UI" протестировать нормально нельзя. Так что обычно тестами покрывают бизнес-логику, а UI прокликивают вручную.


      1. jetexe
        29.07.2022 12:26

        Не в курсе специфики чат ботов на python, но это же может тестироваться как любой другой api клиент и для этого телеграм не нужен в принципе


  1. dmitry_hidden
    29.07.2022 12:26
    -1

    вот специально зашел минус влепить.
    У меня аж подгорает. Откуда мать его этот фап на миллисекунды. За все годы разработки у меня на первом месте всегда была функциональность и акцент на бизнес-логике. И джанго с этим прекрасно справляется. Зачем тачищить асинхронность и алхимию чтобы сэкономить 20 милисекунд? А не знаю в каком мире вы живете, а в моем заказчику куда важнее бизнес функционал, и проще подбросить еще одну машину в облаке, нежели занимать тюнингом кода.

    Хотите скорости, делайте на go. python и django не про скорость выполнения, а про скорость разработки и качество.