Pull to refresh

Comments 4

Использую aiogram-dioalog для довольно большого бота (26 диалогов, 58 окон, 25к строк). Очень удобно, наконец-то разделена обработка события и подготовка и отрисовка следующего меню. Да ещё и в комплекте куча батареек.

Хочу рассказать про мой любимый виджет Jinja

Типичная проблема - мы используем везде html-форматирование, тогда пользовательский ввод надо экранировать. Весь код превращается в кашу из смеси текстовых шаблонов с html.escape. А если вывод сложный, то там ещё и длинная вермишель из for и if.

В случае использования Format в aiogram-dialog в геттере приходится заниматься склейкой каких-то строк в циклах, попутно не забывая экранировать.

Вместо этого можно взять Jinja и использовать любимый шаблонизатор на полную: экранирование при подстановке, циклы, условия, jinja-фильтры, в том числе пользовательские.

Живой пример из моего бота. Задача здесь - отрисовать уровни на каких сейчас находятся команды:

Jinja(
    "{% for level_time in stat %}"
    "{% if level_time.is_finished %}"
    "🏁<b>{{ level_time.team.name }}</b> - финишировала в "
    "{% else %}"
    "🚩<b>{{ level_time.team.name }}</b> - уровень {{ level_time.level_number + 1 }} начат "
    "{% endif %}"
    "{{ level_time.start_at|user_timezone }}\n"
    "{% endfor %}",
),

Получаем примерно такой вывод:

🚩another team - уровень 1 начат 13.05.23 00:05
🚩like a team - уровень 3 начат 13.05.23 01:01
🚩Майтим - уровень 3 начат 13.05.23 00:05
🚩Победители по жизни - финишировала в 13.05.23 05:06

Удобно, что мы так полностью отдели логику представления от логики подготовки данных для представления. Всё то, чем пользуются классические web-приложения теперь доступно и при разработке ботов.

Очень хороший фреймворк, уже продолжительное время использую, в особенности для больших ботов.
С развитым функционалом, активным комьюнити и регулярными апдейтами.
Если кого-то заинтересуют примеры его использования на крупных проектах, можете посмотреть:
- orders_bot
- cost_confirmation_bot
- Shvatka

Я извиняюсь , а как это масштабируется ? Я правильно понимаю никак? Если 1 миллион пользователей одновременно нажмут одну кнопку , они все будут последовательно по очереди обрабатываться?

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

Если же мы говорим о небольших группах или личной переписке - тут более вероятны сложные менюшки. Но тут и нет проблем с масштабированием - разные чаты мы можем обрабатывать параллельно без каких либо проблем.

Sign up to leave a comment.

Articles