2014-02-24 62 views
1

我已閱讀過關於Django中長輪詢的SO,但我的問題並不複雜,需要使用龍捲風或構建聊天應用程序。Django中的長輪詢在數據庫中發生活動時返回響應

我有一個JS客戶端,在N秒後發送輪詢請求。我需要更新包含來自數據庫的信息的表格。我輪詢請求服務器,並且如果在數據庫中的特定表上有任何活動,則應該提取該行並將其返回給客戶端。

比方說我的模型是

class ABC(models.Model): 
    field1 = models.CharField(max_length = 255) 
    field2 = models.CharField(max_length = 255) 
    field3 = models.CharField(max_length = 255) 

如果有任何活動發生在模型ABC,應該提醒我,應該發送回客戶端提供信息。

<script type="text/javascript" charset="utf-8"> 
function addmsg_to_table(msg){ 
    //apending to div 
} 

function waitForMsg(){ 
    /* This requests the url "msgsrv.php" 
    When it complete (or errors)*/ 
    $.ajax({ 
     type: "GET", 
     url: "msgsrv.php", 

     async: true, /* If set to non-async, browser shows page as "Loading.."*/ 
     cache: false, 
     timeout:50000, /* Timeout in ms */ 

     success: function(data){ 
      addmsg_to_table(data); 
      setTimeout(
       waitForMsg, /* Request next message */ 
       1000 /* ..after 1 seconds */ 
      ); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      addmsg_to_table(textStatus + " (" + errorThrown + ")"); 
      setTimeout(
       waitForMsg, /* Try again after.. */ 
       15000); /* milliseconds (15seconds) */ 
     } 
    }); 
}; 

$(document).ready(function(){ 
    waitForMsg(); /* Start the inital request */ 
}); 
</script> 

我該怎麼辦?我應該如何建模我的views.py來發送響應。 我如何知道桌子上是否發生過活動?我完全不熟悉它。謝謝

回答

0

那麼,有兩種方法可以解決這個問題,這是因爲沒有將Django用作實時框架的理智方式。

要正確執行實時通知,您必須部署實時服務器,例如Tornado。這個流程將起作用,只要一個對象被保存,你就可以將它通告給某個消息傳遞/排隊後端。另一方面,龍捲風會監聽這些事件,然後通過WebSockets(或像Sock.JS這樣的抽象層)將它們分發給相關的客戶端。

如果這是一個低流量的情況,並且如果部署Tornado絕對不可能,那麼您每隔N秒就會有一次長輪詢。查詢本身可以在可添加到模型的last_updated字段上執行。

或者,您可以嘗試一種完全忽略數據庫的複雜解決方案,並在最近更新特定記錄時利用緩存來返回快速結果。但這真的取決於你的模型和使用模式。

+0

那麼,我的應用程序不是那麼容易使用龍捲風或網絡套接字(如前所述)。對我來說,每隔N秒輪詢一次最適合。但是我的實際查詢是:如何在我的表中發現某個活動是否在我的表內發生,如果我沒有在我的模型中使用時間字段。如果我在模型中有'time'字段,我很容易得到範圍內的結果列表,但由於我沒有時間字段,我怎麼才能知道某個活動是否發生在我的桌子上,或者不? – PythonEnthusiast

+0

編輯我的答案 –

相關問題