Хоть вопрос и был задан давно, но я тоже столкнулся с этой проблемой.
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