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"})