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秒ごとに、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は表示しませんか?私を助けてください、私は立ち往生しています。

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 に答える