Самый простой Python длинный опрос
Я видел некоторые темы о длинном опросе в python, но моя проблема не так уж и мала в использовании некоторых дополнительных наборов, таких как торнадо и т. Д. У меня есть js клиент. Он отправляет запросы на мою / длинную страницу и ждет ответа. Получив ответ или тайм-аут, он отправляет новый. Это работает хорошо. Мой /longpolling обработчик является функцией:
currentTime = datetime.datetime.now()
lastUpdate = datetime.datetime.strptime(req.GET["ts"], "%Y-%m-%dT%H:%M:%S.%f")
response = {
"added": [],
"updated": [],
"deleted": []
}
while (datetime.datetime.now() - currentTime).seconds < 600:
time.sleep(2)
now = datetime.datetime.now()
#query = Log.objects.filter(time__range = (lastUpdate, now))
query = Log.objects.raw("SELECT * FROM ...log WHERE time BETWEEN %s and %s", [lastUpdate, now])
exist = False
for log in query:
exist = True
type = {
NEW: "added",
UPDATED: "updated",
DELETED: "deleted"
}[log.type]
response[type].append(json.loads(log.data))
if exist:
response["ts"] = now.isoformat()
return JsonResponse(response)
response["ts"] = datetime.datetime.now().isoformat()
return JsonResponse(response)
Каждые 2 секунды в течение 10 минут я хочу проверять наличие новых экземпляров журнала в БД для уведомления клиента js. Я попытался вставить запись журнала вручную через phpMyAdmin, но следующий Log.objects.filter(time__range = (lastUpdate, now)) возвращает пустой QuerySet. Я копирую необработанный запрос из.query attr это выглядит так:
ВЫБРАТЬ... ОТ... ГДЕ ВРЕМЯ МЕЖДУ 2013-01-05 03:30:36 и 2013-01-05 03:45:18
Поэтому я процитировал 2013-01-05 03:30:36 и 2013-01-05 03:45:18 и выполнил этот SQL через phpMyAdmin, и он вернул мою добавленную запись. Я пытался:
query = Log.objects.filter(time__range = (lastUpdate, now))
а также
query = Log.objects.raw("SELECT * FROM ...log WHERE время между%s и%s", [lastUpdate, now])
а также
для входа в систему query.iterate():
Но он всегда возвращает пустой QuerySet, но никогда не добавляет мою добавленную запись. Я думал, что есть некоторое кеширование, но где? Или проблема в том, что я вставляю новую запись до тех пор, пока выполняется цикл True:? Или, может быть, есть какая-то защита потока? Почему phpMyAdmin видит запись, а django - нет? Пожалуйста, помогите мне, я застрял.
1 ответ
Я не сталкивался с этой проблемой, поэтому я не уверен. Основываясь на ответе @DanielRoseman в ветке, которую вы указали в комментариях, вы можете сделать это:
with transaction.commit_on_success():
query = Log.objects.raw("SELECT * FROM ...log WHERE time BETWEEN %s and %s", [lastUpdate, now])
Тем не менее, более вероятно, что вам придется обернуть строки, вставляющие записи журнала в commit_on_success
декоратор. Я не уверен, где в вашем коде вставлены записи журнала.