Webhook из Django 4.1 в python-telegram-bot 20.0a2


Я использую библиотеку python-telegram-bot 20.0a2 и Django 4.1

Бот запускается скриптом main.py:

if __name__ == "__main__":
    asyncio.run(main())

Внутри основного скрипта я также запускаю uvicorn в том же асинхронном контексте, что и Application экземпляр

# Run application and webserver together
async with application_tg:
    await application_tg.start()
    await server.serve()       # uvicorn
    await application_tg.stop()

В чем проблема?
Я использую webhook для своего бота
. Django's url.py вызывает async view, но view не может получить initalized Application instance бота.

Итак, вопрос в следующем:
Как можно перестроить схему взаимодействия между python-telegram-bot 20 и Django 4.1 таким образом, чтобы я мог обращаться к экземпляру Application из Django hook?

Добавление:
Этого легко достичь, используя другие фреймворки, такие как starlette, как указано на официальной вики-странице библиотеки PTB: https://docs.python-telegram-bot.org/en/v20.0a2/examples.customwebhookbot.html


Мой основной скрипт: https://gist.github.com/SergSm/6843fadf505b826f83a10bf7eebc3fa0

Мое мнение:

import json
from django.views import View
from django.http import JsonResponse, HttpResponse
from django.views.decorators.csrf import csrf_exempt

from telegram import Update

from bot.tgbot.main import application_tg

async def telegram_handle(request):
    if request.method == 'POST':
 
        await application_tg.update_queue.put(
            Update.de_json(data=json.loads(request.body), bot=application_tg.bot)
        )
 
        return JsonResponse({"ok": "POST processed"})
    else:
        return JsonResponse({"ok": "GET processed"})
Вернуться на верх