2012-12-17 92 views
0

我做了一個小應用來充當瀏覽器使用請求,它利用庫的能力來處理會話並正確地將CSRF令牌傳遞給Django。Django根據事件不斷向客戶端發送數據

這種連接有多個應用程序連接到服務器,在這裏需要處理認證和會話,並完成此操作。

我需要將客戶端永久連接到Django服務器端,我認爲這可以通過設置會話僅在客戶端關閉或斷開連接時到期來處理。

我想要做的另一件事是讓django根據服務器上的一些事件開始發送數據,利用與已驗證和登錄的客戶端的開放會話,我該怎麼做?

請記住,將負責處理服務器上的事件並相應地向客戶端發送一些消息/數據的功能不是查看功能,其中可以使用return HttpResponse;即使HttpResponse只能針對每個請求發送一次響應,而不是針對某個可能會重複的事件發送響應,因此可能會發送多個響應。

+1

Django不是爲這樣的任務而設計的。嘗試基於事件的Web服務器實現,如Tornado。 –

+0

感謝Alex,我會嘗試對基於事件的Web服務器進行一些研究。 – securecurve

回答

1

這將需要大量的努力才能讓django做到這一點,而不需要不可能的內存要求,即使如此,它仍然比它的價值更難,所以我會提出一些替代方案。

你可能會看到如果django-socketio會幫助你做你想做的事,但它看起來好像已經過時了。

我最後一次不得不將實時事件從django應用程序推送到客戶端,我使用rabbitmq服務器將消息分組傳送到連接到我使用龍捲風建立的非常薄的服務器的隊列中,警察方式。這很有效,但它最終成爲一個複雜的系統,有很多移動部件不是最易維護的。

最近,當我不得不做事情被推送到客戶端時,我使用了node.js + socket.io,這很容易工作(至少如果你不使用完整路由我不是,

如果你想和django一起使用這個設置,你可以運行一個獨立的node.js服務器,但是你服務的是django,並且把HAproxy放在整個棧的前面避免跨域問題,剩下的唯一問題就是如何在節點服務器和你的django應用程序之間進行連接,這可能是私有端口上的HTTP調用,redis pub/sub設置,某種類型的消息設置,比如rabbit或者zeromq,或任何你夢寐以求的東西。

+0

謝謝JeffS。在閱讀你的答案之後,我可以得出結論,使用最簡單的方法用django做這樣的實現,而不使用Node.js(這會增加我的項目的不必要的複雜性)是使用rabbitmq或類似的方法,而在客戶端使用一些消息庫,比如pymq。 我真的不明白你的回答是,爲什麼你在客戶端使用Tornado,是因爲你面對使用客戶端消息隊列處理消息的問題,或者你的意思是不同的東西,我不明白這一點嗎? – securecurve

+1

在我們的情況中,我們要求客戶端是一個不能直接連接到兔子的web瀏覽器,所以我們在Tornado + Stormed中編寫了一個小的(<100行python)服務器,它基本上可以在HTTP Long輪詢和兔子。 – JeffS

+0

我明白你的觀點,現在對我來說事情更加清晰。 我會做一些研究,並通過我的問題,如果有的話,這個SO線程。再次感謝:)) – securecurve

相關問題