@remendado

Чем заменить Executor при переходе на aiogram 3?

Есть бот, написанный на питоне с asyncio и aiogram 2.25, в котором успешно уживаются поллинг и таски (общение с БД).

Структурно выглядит так:

from aiogram.utils import executor

async def on_start(_):
    asyncio.create_task(periodic())
# дальше поднимается коннект к БД

async def on_stop(_):
    await bot.close()
# дальше закрывается коннект к БД

@dp.message_handler(commands=["start"])
async def start_command(message: types.Message):

## some code

async def periodic():

    while True:
##    some code
        await asyncio.sleep(60 - datetime.datetime.now().second)

if __name__ == "__main__":
    logger.info("Starting script")
    executor.start_polling(dp, on_startup=on_start, on_shutdown=on_stop)


С тех пор как aiogram 2 начал пропадать из репозиториев, задумался о переводе хозяйства под aiogram3. Executor из него успешно выпилили. Подскажите, кто в теме, как лучше его заменить?
  • Вопрос задан
  • 5766 просмотров
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix
yellow
https://docs.aiogram.dev/en/latest/migration_2_to_...

Использовать вместо него Dispatcher
Ответ написан
@maximq
QA Engineer
Извиняюсь за некропостинг, но возможно кому-то это пригодится. Искал подобное решение, но для startup (хотя там и on_shutdown есть) - https://docs.aiogram.dev/en/latest/dispatcher/webh...
У объекта dp вызвать метод startup.register (или shutdown.register)
async def on_startup(bot: Bot) -> None:
    await print('it's working!')


def main() -> None:
    dp = Dispatcher()
    dp.include_router(router)

    dp.startup.register(on_startup)

    bot = Bot(TOKEN, parse_mode=ParseMode.HTML)

    app = web.Application()

    webhook_requests_handler = SimpleRequestHandler(
        dispatcher=dp,
        bot=bot,
        secret_token=WEBHOOK_SECRET,
    )
    webhook_requests_handler.register(app, path=WEBHOOK_PATH)

    setup_application(app, dp, bot=bot)

    web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    main()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы