Самый простой 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 декоратор. Я не уверен, где в вашем коде вставлены записи журнала.

Другие вопросы по тегам