2013-01-05 81 views
0

我看到了有關的蟒蛇長輪詢某些線程,但我的問題是沒有這麼位使用一些額外的工具包像龍捲風等 我有JS的客戶端。它將請求發送到我的/ longpolling頁面並等待響應。一旦它得到響應或超時,它會發送一個新的。這很好。 我/ longpolling處理程序是一個函數:Simpliest蟒蛇長輪詢

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插入日誌記錄manualy,但接下來的Log.objects.filter(time__range =(lastUpdate,now))返回空的QuerySet。我複製原始查詢從.query attr它看起來像:

SELECT ... FROM ... WHERE時間BETWEEN 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,它返回了我添加的記錄。 我tryed:

查詢= Log.objects.filter(time__range =(LASTUPDATE,現))

查詢= Log.objects.raw(「SELECT * FROM ... WHERE登錄時間與%s和%s」,[LASTUPDATE,現在])

日誌中query.iterate():

但它總是返回一個空查詢集,但從來沒有我添加的記錄。 我以爲有一些緩存,但在哪裏? 或者問題是我插入新記錄,直到而True:循環正在執行?或者也許有一些線程保護?爲什麼phpMyAdmin看到記錄,但Django不記錄? 請幫我,我卡住了。

+1

嘗試在查詢之前使用django代碼插入日誌條目。難道你不小心將phpMyAdmin指向了你指向Django的不同數據庫?調試和生產dbs之間的區別? – dokkaebi

+0

好主意在之前插入新的日誌條目,我會嘗試並回答。不,它們連接到同一個數據庫。 –

+0

Okey,所以如果我在查詢之前創建新的日誌條目,我在QuerySet中獲取它並正確添加到響應對象並響應客戶端。在客戶端發送新的請求後,如此預期,那麼現在呢? –

回答

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裝飾者。我不確定在代碼中插入日誌條目的位置。