Решил я тут пофрилансить для души, и увидел, что каждый третий проект по разработке чат-бота предполагает интеграцию веб-админки. В основном это касается онлайн-магазинов, где заказчик пытается сэкономить на сайте и заменить его монстрючим чат-ботом. При этом рулить проектом ему удобнее в привычной среде. Отсюда и возникает пунктик — "хочу админку". Функциональность этой штуковины обычно заканчивается на обновлении информации о товарах, назначении админов, управлении рассылками... в общем, простые манипуляции с базой, не более. Так вот, дефолтный разработчик, видя этот пункт, берет, мать ее, Django. Почему? Ну конечно, причина кроется в лени колхозить свою админку, и притащить красивую Джанговую реализацию кажется хорошей идеей. Заказчик, в свою очередь, гуглит топ веб-фреймворков и одобрительно кивает на сей перфоманс. А иногда и подливает масла в огонь, прямо в описании работы тегая Django.
Ну что, мы разобрались с тем, откуда 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)
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 и так же экономит время и деньги.
akamoroz
27.07.2022 17:44Из реальных минусов django admin не указан самый главный: отсутствие нормальной кастомизации.
В реальной жизни первое время встречались кейсы, когда клиент не понимал почему я сделал такую красивую админку быстро, но не могу "перекрасить всего лишь кнопку".
Теперь я говорю так: админку даю вам в подарок as-is и мы ее внешне не переделываем. Как только функционал бота будет более-менее стабилизирован, бизнес модель протестирована, то выделяем бюджет и делаем нормальную панель на FastAPI + Vue/Flutter/подставьте_свою_технологию с любым дизайном. Такой подход уже работает нормально.
devkarych Автор
27.07.2022 17:53Отличное дополнение. А почему бы не выкатывать сразу на стадии MVP нормальную админку под FastAPI? По требованиям заказчиков, какие я встречал, они все ± на одно лицо, и можно себе накидать базовый универсальный шаблон с UI на том же Vue.
MrShandy
27.07.2022 23:26А почему бы не выкатывать сразу на стадии MVP нормальную админку под FastAPI?
Потому что ее еще нужно сделать, потратить некое количество времени (быстро и функционально вроде невозможно), а тут уже готовое.
Как написали выше, админку можно прикрутить потом, когда все будет стабильно
allburov
29.07.2022 05:43А можно вопрос - в докер с aiogram для взаимодействия с БД что используете, Джанго ORM или что-то асинхронное?
Просто Джанго орм же вроде синхронный полностью, получается блокируется весь луп пока ОРМ не выполнит запрос объектов. Или используете пул из синхронных экзекьютеров для этого?
Сам столкнулся с такой проблемой и пока просто выбрал синхронный фреймворк для телеграмм, чтобы дружить с Джанкой, ни такие там рпс на ботов чтобы ассинхрогщину держать обычно.
Nerevar_soul
27.07.2022 23:04+1А чем aiogram лучше чем python-telegram-bot? Из-за того что python-telegram-bot пока только переезжает на asyncio?
devkarych Автор
27.07.2022 23:25+21) 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) Он очень хорош с точки зрения наличия документ-строк (докстрингов), подсказок типов (тайпхинтов), без которых программировать на питоне уже дискомфортно.
Nerevar_soul
28.07.2022 09:21Спасибо за подробный ответ! Думаю попробовать aiogram, как раз надо небольшого бота написать.
python-telegram-bot тоже фреймворк. Полноценной FSM в нем нет, но какое-то подобие в виде ConversationHandler есть. И диалог с помощью него в принципе можно написать. Я как раз почему-то думал что aiogram небольшая библиотечка, основной плюс которой, то что он написан на asyncio. A python-telegram-bot здоровый фреймворк типа джанги, где есть куча всего
n0cronix
28.07.2022 10:41А почему не разнести просто эту историю на 2 микросервиса. Джанго в одном, классический бэк. Айограм в другом, по факту и бай дезайн - фронтенд.
Есть даже проект в закрамах гитхаба с таким подходом и работает вполне сносно.
chigiwar
28.07.2022 12:08А почему бы просто не поднять сервис на DRF и путь aiogram по API работает с джангой. Таким образом у Вас будет разделена отвественность. aiogram взаимодействие с пользователем, логика в API. Более того методы API можно будет переиспользовать, если проект будет развиваться и понадовится нормальный фронт.
Pongo
28.07.2022 22:55Глянул шаблоны — нигде толком нет тестов. Неужели боты тестируются вручную?
devkarych Автор
29.07.2022 11:00Специфика чат-ботов в Telegram такова, что есть ограничение BotAPI — бот не может писать боту. По этой и многим другим причинам именно "UI" протестировать нормально нельзя. Так что обычно тестами покрывают бизнес-логику, а UI прокликивают вручную.
jetexe
29.07.2022 12:26Не в курсе специфики чат ботов на python, но это же может тестироваться как любой другой api клиент и для этого телеграм не нужен в принципе
dmitry_hidden
29.07.2022 12:26-1вот специально зашел минус влепить.
У меня аж подгорает. Откуда мать его этот фап на миллисекунды. За все годы разработки у меня на первом месте всегда была функциональность и акцент на бизнес-логике. И джанго с этим прекрасно справляется. Зачем тачищить асинхронность и алхимию чтобы сэкономить 20 милисекунд? А не знаю в каком мире вы живете, а в моем заказчику куда важнее бизнес функционал, и проще подбросить еще одну машину в облаке, нежели занимать тюнингом кода.
Хотите скорости, делайте на go. python и django не про скорость выполнения, а про скорость разработки и качество.
zueve
По моему django-admin действительно крутой проект, возможно это самая лучшая часть django (еще мне нравятся миграции). И странно, но до сих пор нет вменяемых альтернатив (например для той же FastAPI), что бы можно так же легко и быстро создать админку. Всему конечно своя цена, и с ростом сложности, обходить костыли Django становится все сложнее. Но в чат админке ограничений намного больше
RH215
С одной стороны, да. С другой -- простой табличный вывод с шаблонизатором и фильтром реализуется за несколько часов. Джанга же нервов потреплет в сумме больше, чем на несколько часов.
danilovmy
Больше чем несколько часов - Это только если разработчик не знает 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. Я к тому, что сложности в кастомизации админки только у тех, кто не понял как она работает. А таких, увы, очень много.
devkarych Автор
Согласен, я и указал в "плюсах", что Django-admin — классная вещь с точки зрения скорости развертывания. Но там первое слово — Django, и тащить весь фреймворк в проект просто из-за админки — решение почти всегда не лучшее.
Кстати про FastAPI: я начал следить за проектом: https://github.com/fastapi-admin/fastapi-admin. Похоже, потихоньку развиваются альтернативы django-admin.
mgis
Думаю вопрос поддержки алхимии для fastapi-admin вопрос времени.