最简单的python长轮询

时间:2013-01-05 01:57:15

标签: python django multithreading long-polling ajax-polling

我在python中看到了一些关于长轮询的线程,但是我的问题并不是要使用龙卷风等其他套件。 我有js客户端。它将请求发送到我的/ longpolling页面并等待响应。一旦得到响应或超时,它就会发送新的响应。这很好用。 我/ 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)

10分钟内每2秒我想检查DB中的新Log实例以通知js客户端。 我尝试通过phpMyAdmin手动插入日志记录,但接下来Log.objects.filter(time__range =(lastUpdate,now))返回空QuerySet。我从.query attr复制原始查询,它看起来像:

  

SELECT ... FROM ...时间比较2013-01-05 03:30:36和2013-01-05 03:45:18

所以我引用2013-01-05 03:30:36和2013-01-05 03:45:18并通过phpMyAdmin执行此SQL并返回我添加的记录。 我试过了:

  

query = Log.objects.filter(time__range =(lastUpdate,now))

  

query = Log.objects.raw(&#34; SELECT * FROM ... log WHERE time BETWEEN%s和%s&#34;,[lastUpdate,now])

  

登录query.iterate():

但是它总是返回一个空的QuerySet但从来没有添加过我的记录。 我以为有一些缓存,但在哪里? 或者问题是我插入新记录直到而True:循环正在执行?或者也许有一些线程保护?为什么phpMyAdmin看到记录但django没有? 请帮助我,我被卡住了。

1 个答案:

答案 0 :(得分: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装饰器中插入日志条目的行。我不确定代码在哪里插入日志条目。