callback aiogram меняет данные переменной другого чата
Надеюсь верно сформулировал вопрос. Ситуация следующая, бот генерирует InLine кнопки, после нажатия на кнопку в чате, callback ловит значение этой кнопки и далее записывает это значение в переменную. Проблема в том, что если одновременно несколько людей нажмут на кнопку (они разные около 10), то у всех пользователей будет значение в переменной от последнего нажавшего
@dp.callback_query_handler(text = list_button_name, state = None)
async def process_callback_name(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await Make_Task.waiting_for_Task.set()
global executor
executor = callback_query.data
print(executor)
await bot.send_message(callback_query.from_user.id, 'Отлично, поработаем!')
От начала работы с выбранной кнопкой до конца 4 разных состояния (подобие заполнения анкеты). На последнем шаге данные записываются в БД и если в промежутке между перым и последним состоянием кто-то так же захочет поработать с InLine кнопками, то он изменит переменную и тем самым данные у первого пользователя будут неверные (значение кнопки изменится). Буду признателен за помощь.
Ответы (1 шт):
Такс. Первое что меня смутил это даже не глобальные переменные, а название этой самой переменной. Екзекутор? Серйозно? Я уже было подумал вы это айогрмовский екзекутор насилуете. Ну да ладно.
Смотри.
@dp.callback_query_handler(text=list_button_name)
async def process_callback_name(callback_query: types.CallbackQuery, state: FSMContext):
await callback_query.answer()
await Make_Task.waiting_for_Task.set()
async with state.proxy() as data:
data["executor"] = callback_query.data
await bot.send_message(callback_query.from_user.id, 'Отлично, поработаем!')
Кода ты дал мало, поэтому возможны косяки. Что я сделал? Вместо глобальной переменной я использовал то, что дает нам айограм - FSM. Если кратко то вот тут
async with state.proxy() as data:
мы открыли некий "проксированный" словарь и просто записали туда нашу колбек дату, вместо того чтобы заниматься извращениями и записывать и в глобальные переменные, которые использовать нужно в большинстве случаев НИКОГДА. Практически никогда. Иногда можно, но точно не в этом случае.
И на всякий случа еще скажу. Если вы потом сделаете state.finish или state.reset_state то все данные в стейте обнуляться. Так что будь осторожен.
PS. и ещё скажу. любой хендлер по-умолчанию имеет в декораторе state=None и content_types=['text'] поэтому смысла их дописывать нет. Разве что для личного понимания того что происходит в коде.