Отправить 200 OK сразу при получении запроса
Пишу бота для вконтакте на Django(2.2.4), с библиотекой vk_api
Некоторые из функций достаточно долгие (выполняются за 5-7 секунд). Но вконтакте требует, чтобы сервер отвечал не дольше 3 секунд. Если ответ задерживается, запрос отправляется повторно, и бот спустя некоторое время начинает отправлять одинаковое сообщение много раз. (Использую Callback Api)
Возможно ли решить эту проблему без серьезных изменений в коде?
@csrf_exempt
def MainBotView(request):
# Нужно чтобы ok отправился здесь
#... много кода ...
return HttpResponse('ok')
( Если имеет значение, бот работает на pythonanywhere )
Ответы (1 шт):
Всем спасибо, проблему удалось решить без асинхронности и потоков. Может быть это решение поможет тем, кто столкнулся с такой проблемой.
Теперь бот будет просто игнорировать повторные события. Не самый лучший костыль, но при первых тестированиях дал нужный результат.
Бот записывает последний ответ. Если приходит 2 раза подряд одинаковый запрос на обработку фото, то сразу возвращается OK. Каждые 30 секунд очередь очищается.
(Нагрузка на бота 10-20 подобных сообщений в день, думаю при таких условиях подобное решеие уместно)
LastRequestList = []
...
obj = data["object"]
peer_id = obj["peer_id"]
body = obj["text"]
for item in LastRequestList:
if item[2] - time.time() > 30:
LastRequestList.remove(item)
if item[0] == peer_id and item[1] == body:
LastRequestList.remove(item)
return HttpResponse('ok')
if body.upper().find('ФОТО') != -1:
LastRequestList.append((peer_id, body, time.time()))