0

我在 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 秒我想检查数据库中的新日志实例以通知 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,它返回了我添加的记录。我试过了:

查询 = Log.objects.filter(time__range = (lastUpdate, now))

query = Log.objects.raw("SELECT * FROM ...log WHERE time BETWEEN %s and %s", [lastUpdate, now])

用于登录 query.iterate():

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

4

1 回答 1

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装饰器中插入日志条目的行换行。我不确定在您的代码中插入日志条目的位置。

于 2013-01-06T03:48:25.340 回答