2011-10-16 79 views
1

編輯 好的我有一個從javascript談判到Django視圖的長輪詢。該視圖如下所示。它丟失了我從頻道中的redis客戶端發佈的一些消息。另外我不應該連接到每個請求的redis(也許redis變量可以保存在會話中?) 如果有人可以指出我需要使這個視圖長時間輪詢工作的變化,這將是太棒了!謝謝!創建一個網址,收聽redis pubsub發佈的消息

def listen (request): 
     if request.session: 
      logger.info('request session: %s' %(request.session)) 
     channel = request.GET.get('channel', None) 
     if channel: 
      logger.info('not in cache - first time - constructing redis object') 
      r = redis.Redis(host='localhost', port=6379, db=0) 
      p = r.pubsub() 
      logger.info('subscribing to channel: %s' %(channel)) 
      p.psubscribe(channel) 
      logger.info('subscribed to channel: %s' %(channel)) 
      message = p.listen().next() 
      logger.info('got msg %s' %(message)) 

      return HttpResponse(json.dumps(message)); 

     return HttpResponse('') 

----原來的問題--- 我想創建一個聊天應用程序(使用Django,蟒蛇),我試圖避免輪詢機制。我現在一直在努力 - 所以任何指針都會非常感謝!

由於網絡套接字在大多數瀏覽器中都不被支持,我認爲長時間輪詢是正確的選擇。現在我正在尋找比普通輪詢更好的東西,並且很容易與python django堆棧集成。一旦我完成了這個開發,我就會想到其他的python框架(龍捲風龍捲風,gevent等等)。

我做了一些研究,喜歡redis pubsub機制。聊天消息將發佈到兩個用戶已訂閱的頻道。以下是我的問題:

  1. 據我瞭解,阿帕奇將無法很好地擴展,因爲長輪詢很快就會碰上進程/線程的限制。因此我決定切換到nginx。這個理由是否正確?我也擔心nginx會涉及到什麼問題?特別是,我擔心最新版本不支持代理服務器傳遞,如博客文章中提到的http://www.letseehere.com/reverse-proxy-web-sockets

  2. 如何在瀏覽器端創建消息訂閱的客戶端部分?在我看來,這將是一個JavaScript代碼將「長期輪詢」的網址。因此,在JavaScript級別,客戶端將輪詢一個在服務器端以「非阻塞方式」獲取「阻止」的url。當結果(在這種情況下是新的聊天消息)出現時,服務器返回結果。 Javascript做它所需要的,然後再次調查相同的網址。這個想法是否正確?在JavaScript循環暫停的時間間隔內會發生什麼 - 我們是否會丟失服務器端的任何消息。

從本質上說,我想創建以下文件:

  1. 從Redis的,我發佈一條消息到一個通道「富」(可以使用Redis的-CLI也 - 便於以後合併它在python/django中)

  2. 我想要在兩個使用相同js代碼輪詢的瀏覽器窗口中顯示相同的消息。假設瀏覽器代碼知道測試目的的通道名稱

  3. 我發佈了第二條消息,該消息再次出現在兩個瀏覽器窗口中。

我是新來的實時應用程序,所以可能沒有意義的任何問題道歉。

謝謝!

回答

0

也只是回答你的問題部分和提一個選項了許多:Gunicorn正在與異步工人階級使用是長輪詢/非阻塞的請求的解決方案是很容易設置!

+0

thanx!我簡要閱讀了關於gunicorn。我正在閱讀它。當你寫上面提到的「訂閱郵件」請求的http端的部分時,你的django代碼是怎麼樣的?它如何影響已經寫好的其他django代碼? –