編輯 好的我有一個從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機制。聊天消息將發佈到兩個用戶已訂閱的頻道。以下是我的問題:
據我瞭解,阿帕奇將無法很好地擴展,因爲長輪詢很快就會碰上進程/線程的限制。因此我決定切換到nginx。這個理由是否正確?我也擔心nginx會涉及到什麼問題?特別是,我擔心最新版本不支持代理服務器傳遞,如博客文章中提到的http://www.letseehere.com/reverse-proxy-web-sockets?
如何在瀏覽器端創建消息訂閱的客戶端部分?在我看來,這將是一個JavaScript代碼將「長期輪詢」的網址。因此,在JavaScript級別,客戶端將輪詢一個在服務器端以「非阻塞方式」獲取「阻止」的url。當結果(在這種情況下是新的聊天消息)出現時,服務器返回結果。 Javascript做它所需要的,然後再次調查相同的網址。這個想法是否正確?在JavaScript循環暫停的時間間隔內會發生什麼 - 我們是否會丟失服務器端的任何消息。
從本質上說,我想創建以下文件:
從Redis的,我發佈一條消息到一個通道「富」(可以使用Redis的-CLI也 - 便於以後合併它在python/django中)
我想要在兩個使用相同js代碼輪詢的瀏覽器窗口中顯示相同的消息。假設瀏覽器代碼知道測試目的的通道名稱
我發佈了第二條消息,該消息再次出現在兩個瀏覽器窗口中。
我是新來的實時應用程序,所以可能沒有意義的任何問題道歉。
謝謝!
thanx!我簡要閱讀了關於gunicorn。我正在閱讀它。當你寫上面提到的「訂閱郵件」請求的http端的部分時,你的django代碼是怎麼樣的?它如何影響已經寫好的其他django代碼? –