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内の新しいログインスタンスをチェックして、jsクライアントに通知したいと思います。phpMyAdminを使用してログレコードを手動で挿入しようとしましたが、次のLog.objects.filter(time__range =(lastUpdate、now))は空のQuerySetを返します。.queryattrから生のクエリをコピーします。次のようになります。
SELECT ... FROM ... WHERE time BETWEEN 2013-01-05 03:30:36 and 2013-01-05 03:45:18
そこで、2013-01-0503:30:36と2013-01-0503:45:18を引用し、phpMyAdminを介してこのSQLを実行すると、追加されたレコードが返されました。私が試した:
query = 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が返されますが、追加されたレコードは返されません。キャッシングがあると思いましたが、どこですか?または、問題は、 True:ループが実行されている間まで新しいレコードを挿入することです。それとも、スレッド保護がありますか?なぜphpMyAdminはレコードを表示しますが、djangoは表示しませんか?私を助けてください、私は立ち往生しています。