Как регистрировать пользователей в телеграм боте на python (aiogram)
Сделал регистрацию путем установки состояний, в которых мы перехватываем ответы пользователя и записываем в переменные, после проработки всех состояний, мы записываем в бд информацию о пользователе. Проблема заключается в том, что если регистрироваться будут одновременно 2 пользователя, то бот может записать в переменные данные, которые вводит другой пользователь. Как я мог бы это исправить? (по необходимости готов приложить код)
class AwaitMessages(StatesGroup):
fio_add = State()
phone_add = State()
@dp.message_handler(state=AwaitMessages.fio_add)
async def process_fio_add(message: types.Message, state: FSMContext):
user_registration.fio = message.text
await state.finish()
await client.send_message(message.chat.id, 'Введите телефон: ')
await AwaitMessages.phone_add.set()
Ответы (2 шт):
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
import config
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class AwaitMessages(StatesGroup):
fio_add = State()
phone_add = State()
@dp.message_handler(state=AwaitMessages.fio_add)
async def process_fio_add(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['fio'] = message.text
# зачем?
# await state.finish()
# нет смысла юзать bot.send_message если вы отправляете в этот же чат
# await bot.send_message(message.chat.id, 'Введите телефон: ')
await message.answer('Введите телефон.')
await AwaitMessages.phone_add.set()
@dp.message_handler(state=AwaitMessages.phone_add)
async def process_fio_add(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['phone'] = message.text
await message.answer(f'ФИО - {data["fio"]}\nНомер - {data["phone"]}')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Как по мне, то в старте, например, нужно проверить есть ли такой пользователь в бд? Кстати, если вы используете базу данных sqlite + orm peewee с использованием классов, то можно в процессе получения данных (имя, номер телефона) обновлять:
await state.update_data(name=message.text)
…
await state.update_data(phone=message.contact.phone_number)
Далее как получили данные и хотите их записать в бд:
user_data = await state.get_data()
Дальше по ключу присваиваете значения.