Функция не обновляется в asyncio
Я пишу бота на aiogram с бэкендом на django для postgresql (была та же проблема до конвертации из чистого psycopg2).
Одно из конечных состояний, в котором я нахожусь, должно постоянно проверять обновления в БД, только этого не происходит. Вот код для цикла в боте:
@dp.message_handler(state=Current.start_state)
async def func(msg: types.Message, state: FSMContext):
async def res():
return await function(args)
global ticket
ticket = await res()
while ticket == -1:
ticket = await res()
if ticket == -1:
await asyncio.sleep(3)
print(ticket) #debugging
Я пробовал без функции:
@dp.message_handler(state=Current.start_state)
async def func(msg: types.Message, state: FSMContext):
global ticket
ticket = await function(args)
while ticket == -1:
ticket = await function(args)
if ticket == -1:
await asyncio.sleep(3)
print(ticket )
И многие другие комбинации, включая создание условия цикла while = True и прерывание цикла при выполнении условия. И я могу вас заверить, результаты меняются, я вижу это в pgAdmin4 и запуская эту функцию отдельно в другом скрипте во время работы бота. Кажется, что иногда это работает, если я вручную изменяю информацию в DB, и даже тогда, не всегда. В основном, пока этот цикл выполняется для пользователя A, другой пользователь B добавляет материал в DB, который должен отображаться для пользователя A. Когда это делается через бота, информация пользователя A не обновляется вообще, в отличие от изменения информации в DB вручную. Кажется, что все работает правильно, когда я использую time.sleep(), но это, очевидно, блокирует поток, и никто больше не может использовать бота.
Это функция, которая запрашивает базу данных:
@sync_to_async
def function(args):
admin = User.objects.get(username=args)
ticket = Tickets.objects.filter(admin_nick=admin, accepted=None)[:1]
if ticket:
return ticket.values()[0]
else:
return -1
Мне пришлось использовать декоратор sync_to_async, потому что я не знаю лучшего способа сделать функцию django async.