2011-03-29 108 views
32

我目前有一個非常簡單的用Django編寫的Web應用程序,我想在應用程序中實現類似回調/推送通知服務的功能。Django對用戶推送HTTP響應

例如: 當一個用戶(客戶端)上傳照片到服務器時,服務器會通知所有其他連接的用戶關於該照片。

我想我可以在用戶上傳照片時使用Django信號產生回調,但是如何讓Django向其他用戶發佈通知?此通知可能是提醒或者只是將其他用戶重定向到顯示上傳圖片的新html。我更喜歡後者。

我是網絡編程的初學者,所以我不確定這是否符合法案,因爲需要一個實時的Web應用程序來實現諸如彗星或長輪詢之類的事情。我的應用程序類似於聊天應用程序,除了我不提交文本文件而是提交圖像文件。正因爲如此,我認爲彗星解決方案會起作用。我已經嘗試過長時間觀察Orbited和Twisted,但是在用Django實現它的時候沒有運氣,可能是因爲我不明白如何用彗星解決方案來實現我想要的。我希望更有經驗的程序員指出我爲什麼要完成這個任務,或者如果我正在朝着正確的方向前進(與彗星),我究竟需要什麼。

我真的很感激,如果有人可以給我一些技巧和提示,以及如何進行,以及教程鏈接或指南。

回答

54

HTTP本質上是一種「拉」協議 - 即客戶端從服務器提取數據,等待一段時間然後再提取更多數據。實際上並沒有嚴格的HTTP方法將數據從服務器「推」到客戶端。

當您需要「推送」客戶端時,基本上有三種選擇。 (1)輪詢 - 使用Ajax/javascript在每X時間輪詢服務器。 X越小,感覺就越「推」,而且服務器經歷不斷響應這些請求的開銷越大。 (2)使用websockets。 HTML5規範的一部分是所謂的websockets。 Websockets允許瀏覽器打開與服務器的持久連接。一旦這個連接被打開,數據可以從客戶端到服務器和服務器到客戶端來回移動,就像使用更傳統的TCP套接字一樣。 websockets的問題(最後我聽說)是,他們仍然可以在瀏覽器之間有點氣質,當然在舊版瀏覽器中不會工作的所有

(3)使用Flash with a Javascript interface。 Flash有能力設置persistent TCP connections,它可以像使用'正常'TCP連接一樣用於推送/拉取數據。 (參見這太問題,以及:HTTP push examples in Flex


如果你是你寫你的後端在Node.jsSocket.io從頭開始這個項目,我會建議。 Socket.io是可以編程的「類似於套接字」的框架,然後Javascript客戶端(運行在您的web瀏覽器中)智能地確定要使用的最佳「持久連接」 - 首先嚐試使用Websocket,然後使用Flash,然後長期投票的各種類型。


但既然你說你想使用Python/Django的,那麼你應該看看Django-Websockets --a框架使用的WebSockets和Django。但請務必閱讀免責聲明作者放在頁面上,使用它有一些重大的困難/侷限性,主要是因爲Django沒有考慮到websocket的設計。

我認爲當用戶的瀏覽器不支持它時,您最好的選擇最終會使用Websockets,並且智能回退到Ajax輪詢。

+2

+1 cool beans; ) – 2011-03-30 05:43:17

+0

我明白了。感謝您的建議。在選擇我的Web框架平臺之前,我應該對這個推送服務做更多的研究。雖然說實話,在我的網絡應用程序的早期階段,我從未想過需要推送服務。現在我認爲能夠擁有它會很好,但是直到我想用新的後端重做我的項目爲止。另外,感謝您的建議Django的websockets!我可能只是鼓搗它。 :) – evkwan 2011-03-30 12:34:39

+3

自版本1.9開始,uWSGI現在支持Websockets,因此現在可以忽略免責聲明 - https://github.com/unbit/uwsgi-docs/blob/master/WebSockets.rst – Ash 2013-11-06 09:32:11

7

如果您使用nginx,這是一個不錯的選擇:),您可以使用推模塊http://pushmodule.slact.net/,我發現它很容易使用。 您有一個URL可以在頻道上發佈消息(可以通過python輕鬆完成,例如使用httplib),還有一個URL可以從一個頻道中獲取消息(並且一個頻道可能會被多個用戶使用)。有關jQuery集成,另請參閱http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

+1

感謝您的建議!當我嘗試使用Django的websockets時,我會仔細研究一下,因爲它看起來更容易理解。 – evkwan 2011-03-30 12:35:43