@vovawed

Как использовать django orm в телеграм боте?

У меня есть бот написанный на библиотеке PyTelegramBotAPI, в нем я использую django ORM. Раньше у меня выбивало ошибку MySQL Server has gone away, я увеличил MAX_CONNECTION и теперь бот просто перестает работать, не выбивая ошибок.
  • Вопрос задан
  • 769 просмотров
Решения вопроса 1
@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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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