Проблема с register_next_step_handler() используя WebHook. threaded=False

Telegram Bot использует Django 3.2.6, pyTelegramBotAPI 4.0.0. Apache 2.2.29. Cервер использует сертификат от Let’s Encrypt. Бот обрабатывает пошаговый обработчик, однако работоспособность заканчивается на первом шаге. По всей видимости это связанно с переменной:

user_dict = {}

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

Файл views.py

from django.shortcuts import render
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
import requests
import telebot
from telebot import apihelper, types
import logging
logger = logging.getLogger(__name__)

WEBHOOK = 'https://exemple.com'
bot = telebot.TeleBot(settings.TOKEN, threaded=False,  parse_mode='HTML')

@csrf_exempt
def index(request):
    if request.method != 'POST':
        return render(request, 'main/index.html')
    if request.META.get('CONTENT_TYPE') != 'application/json':
        return render(request, 'main/index.html')
    json_string = request.body.decode('utf-8')
    update = telebot.types.Update.de_json(json_string)
    logger.info('Update: %s', update)
    bot.process_new_updates([update])
    return HttpResponse(status=200)

text_messages = {
    'welcome':
        'Привет! Для использования бота, требуется зарегистрироваться.\n\n<b>Как вы хотите зарегистрироваться?</b>',
    'private_person':
        '<b>Вы будете зарегистрированы как физическое лицо.</b>\nСледуйте инструкции ниже.',
    'company':
        '<b>Вы будете зарегистрированы как юридическое лицо.</b>\n Следуйте инструкции ниже.',
}
registration_messages = {
    'first_name':
        'Введите ваше имя.',
    'last_name':
        'Введите вашу фамилию.',
}
user_dict = {}

class UserReg:
    def __init__(self, id_telegram):
        self.id_telegram = id_telegram
        self.first_name = None
        self.last_name = None

    def __repr__(self):
            return f'id_telegram: {self.id_telegram} first_name: {self.first_name} last_name: {self.last_name}'

btn_private_person = types.InlineKeyboardButton(text='Физическое лицо', callback_data='private_person')
btn_company = types.InlineKeyboardButton(text='Юридическое лицо', callback_data='company')



@bot.message_handler(commands=['start'])
def start(message):
    markup = types.InlineKeyboardMarkup()
    markup.add(btn_private_person, btn_company)
    bot.send_message(message.chat.id, text_messages['welcome'], reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def registration(call):
    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup='')
    if call.data == 'private_person':
        bot.send_message(call.message.chat.id, text_messages['private_person'])
    elif call.data == 'company':
        bot.send_message(call.message.chat.id, text_messages['company'])

    msg = bot.send_message(call.message.chat.id, registration_messages['first_name'])
    bot.register_next_step_handler(msg, first_step_reg_org)


def first_step_reg_org(message):
    try:
        chat_id = message.chat.id
        user = UserReg(message.chat.id)
        user_dict[chat_id] = user
        user.first_name = message.text
        msg = bot.send_message(message.chat.id, registration_messages['last_name'])
        logger.warning('FIRST: %s', user_dict[chat_id])
        bot.register_next_step_handler(msg, second_step_reg_org)

    except Exception as e:
        bot.reply_to(message, f'Что-то пошло не так! first\n{e}')


def second_step_reg_org(message):
    try:
        chat_id = message.chat.id
        logger.warning('SECOND: %s',user_dict[chat_id])
        user = user_dict[chat_id]
        user.last_name = message.text

        bot.send_message(message.chat.id, f'Результат: \n{user.first_name}\n{user.last_name}')
    except Exception as e:
        bot.reply_to(message, f'Что-то пошло не так! second\n{e}')

bot.enable_save_next_step_handlers(delay=1, filename="./.handlers-saves/step.save")
bot.load_next_step_handlers(filename="./.handlers-saves/step.save")

bot.set_webhook(url=WEBHOOK)

Файл logs.log

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443 
DATE: 19/09/2021 TIME: 10:41:54 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266 
DATE: 19/09/2021 TIME: 10:41:54 AM

TYPE: INFO, LOCALIZATION: views 
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None} 
DATE: 19/09/2021 TIME: 10:41:54 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21+%D0%94%D0%BB%D1%8F+%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+%D0%B1%D0%BE%D1%82%D0%B0%2C+%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%D1%81%D1%8F+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F.%0A%0A%3Cb%3E%D0%9A%D0%B0%D0%BA+%D0%B2%D1%8B+%D1%85%D0%BE%D1%82%D0%B8%D1%82%D0%B5+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%3F%3C%2Fb%3E&reply_markup=%7B%22inline_keyboard%22%3A+%5B%5B%7B%22text%22%3A+%22%5Cu0424%5Cu0438%5Cu0437%5Cu0438%5Cu0447%5Cu0435%5Cu0441%5Cu043a%5Cu043e%5Cu0435+%5Cu043b%5Cu0438%5Cu0446%5Cu043e%22%2C+%22callback_data%22%3A+%22private_person%22%7D%2C+%7B%22text%22%3A+%22%5Cu042e%5Cu0440%5Cu0438%5Cu0434%5Cu0438%5Cu0447%5Cu0435%5Cu0441%5Cu043a%5Cu043e%5Cu0435+%5Cu043b%5Cu0438%5Cu0446%5Cu043e%22%2C+%22callback_data%22%3A+%22company%22%7D%5D%5D%7D&parse_mode=HTML HTTP/1.1" 200 1319 
DATE: 19/09/2021 TIME: 10:41:54 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: INFO, LOCALIZATION: views 
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None} 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: INFO, LOCALIZATION: views 
MESSAGE: Update: {'update_id': 52392613, 'message': None, 'edited_message': None, 'channel_post': None, 'edited_channel_post': None, 'inline_query': None, 'chosen_inline_result': None, 'callback_query': {'id': '5231228019845620169', 'from_user': <telebot.types.User object at 0x7f4555420820>, 'message': <telebot.types.Message object at 0x7f455547b3d0>, 'inline_message_id': None, 'chat_instance': '-8056055160872487116', 'data': 'private_person', 'game_short_name': None}, 'shipping_query': None, 'pre_checkout_query': None, 'poll': None, 'poll_answer': None, 'my_chat_member': None, 'chat_member': None} 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/editMessageReplyMarkup?chat_id=ID_USER&message_id=2483 HTTP/1.1" 200 1044 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%3Cb%3E%D0%92%D1%8B+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%D0%B5+%D0%B7%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D1%8B++%D0%BA%D0%B0%D0%BA+%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5+%D0%BB%D0%B8%D1%86%D0%BE.%3C%2Fb%3E%0A%D0%A1%D0%BB%D0%B5%D0%B4%D1%83%D0%B9%D1%82%D0%B5+%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8+%D0%BD%D0%B8%D0%B6%D0%B5.&parse_mode=HTML HTTP/1.1" 200 902 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%92%D0%B2%D0%B5%D0%B4%D0%B8%D1%82%D0%B5+%D0%B2%D0%B0%D1%88%D0%B5+%D0%B8%D0%BC%D1%8F.&parse_mode=HTML HTTP/1.1" 200 547 
DATE: 19/09/2021 TIME: 10:41:57 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443 
DATE: 19/09/2021 TIME: 10:42:04 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266 
DATE: 19/09/2021 TIME: 10:42:05 AM

TYPE: INFO, LOCALIZATION: views 
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None} 
DATE: 19/09/2021 TIME: 10:42:05 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%92%D0%B2%D0%B5%D0%B4%D0%B8%D1%82%D0%B5+%D0%B2%D0%B0%D1%88%D1%83+%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8E.&parse_mode=HTML HTTP/1.1" 200 571 
DATE: 19/09/2021 TIME: 10:42:05 AM

TYPE: WARNING, LOCALIZATION: views 
MESSAGE: FIRST: id_telegram: ID_USER first_name: Andrey last_name: None 
DATE: 19/09/2021 TIME: 10:42:05 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: Starting new HTTPS connection (1): api.telegram.org:443 
DATE: 19/09/2021 TIME: 10:42:10 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "GET /BOT.TOKEN/getWebhookInfo HTTP/1.1" 200 266 
DATE: 19/09/2021 TIME: 10:42:10 AM

TYPE: INFO, LOCALIZATION: views 
MESSAGE: WebHookInfo: {'url': 'https://exemple.com', 'has_custom_certificate': False, 'pending_update_count': 1, 'ip_address': '00.000.00.0', 'last_error_date': 1632024887, 'last_error_message': 'Wrong response from the webhook: 500 Internal Server Error', 'max_connections': 40, 'allowed_updates': None} 
DATE: 19/09/2021 TIME: 10:42:10 AM

TYPE: DEBUG, LOCALIZATION: connectionpool 
MESSAGE: https://api.telegram.org:443 "POST /BOT.TOKEN/sendMessage?chat_id=ID_USER&text=%D0%A7%D1%82%D0%BE-%D1%82%D0%BE+%D0%BF%D0%BE%D1%88%D0%BB%D0%BE+%D0%BD%D0%B5+%D1%82%D0%B0%D0%BA%21+second%0AID_USER&reply_to_message_id=2488&parse_mode=HTML HTTP/1.1" 200 958 
DATE: 19/09/2021 TIME: 10:42:10 AM

Telegram Bot интерфейс ошибки


Ответы (1 шт):

Автор решения: CleverMan

Решено. Через функцию register_next_step_handler() необходимо предать переменную user_dict. Это можно сделать так:

def first_step_reg_org(message):
    try:
        chat_id = message.chat.id
        user = UserReg(message.chat.id)
        user_dict[chat_id] = user
        user.first_name = message.text

        msg = bot.send_message(message.chat.id, registration_messages['last_name'])
        bot.register_next_step_handler(msg, second_step_reg_org, user_dict)
    except Exception as e:
        bot.reply_to(message, f'Что-то пошло не так! first\n{e}')


def second_step_reg_org(message, user_dict):
    try:
        chat_id = message.chat.id
        user = user_dict[chat_id]
        user.last_name = message.text

        msg = bot.send_message(message.chat.id, registration_messages['email'])
        bot.register_next_step_handler(msg, third_step_reg_org, user_dict)
    except Exception as e:
        bot.reply_to(message, f'Что-то пошло не так! second\n{e}')

Далее пошаговый обработчик полностью работает. Спасибо, кто уделил внимание этому вопросу!

→ Ссылка