我在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没有? 请帮助我,我被卡住了。
答案 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
装饰器中插入日志条目的行。我不确定代码在哪里插入日志条目。