Ответы пользователя по тегу Django
  • Как использовать django orm в телеграм боте?

    @Rustam
    Хоть вопрос и был задан давно, но я тоже столкнулся с этой проблемой.

    tldr:
    бота нужно инициализировать bot = telebot.TeleBot(TOKEN, threaded=False)

    длинная версия:
    Дело в том, что по умолчанию телебот запускается с возможностью запускать несколько потоков для каждого обработчика событий. В случае с джанго и вебхуками это делается таким образом:

    @csrf_exempt
    def bot_view(request):
        if request.method != 'POST':
            return HttpResponse(status=403)
        if request.META.get('CONTENT_TYPE') != 'application/json':
            return HttpResponse(status=403)
    
        json_string = request.body.decode('utf-8')
        update = telebot.types.Update.de_json(json_string)
        bot.process_new_updates([update])
    
        return HttpResponse(status=200)
    
    @bot.message_handler(commands=['start'])
    def start(message):
        user = message.chat.id
        ...обработка


    Если к боту кто-то сказал /start, то происходит следующее:
    1) приходит post запрос к bot_view, он кладется в очередь, bot_view никакой транзакции не создает и заканчивает работу
    2) в отдельном потоке запускается метод start, который не является реквестом. Он запускает и завершает свою работу в отдельном потоке, при этом никакой очистки ресурсов, в том числе закрытия соединения бд не происходит.

    Тут можно сделать следующее:
    либо в каждом обработчике вручную закрываем все соединения, освобождаем ресурсы, либо запрещаем создавать новые потоки для обработчиков. Для варианта 2 достаточно инициализировать telebot с опцией threaded=False
    Ответ написан
    Комментировать