2014-05-14 16 views
2

我設法創建了一個類似於gevent-socketio的django聊天例子的應用程序。 但是,當我在sockets.py中添加一個名稱空間(類)時,我有socketio錯誤:'no_such_namespace'。django上gevent-socketio中的多個命名空間

我需要在我看來,加

socketio_manage(request.environ, { '/chat': ChatNamespace ,'/other': OtherNamespace },request) 

,但後來我有以下KeyError異常:

File "...socketio/__init__.py", line 67, in socketio_manage 
    socket = environ['socketio'] 
KeyError: 'socketio' 

回答

0

還有,你必須有正確爲了GEVENT一些奇怪的事情Socketio與Django合作。

你應該做的第一件事是確保你使用的是Socketio客戶端版本0.9.6(它應該在源代碼中說你使用的是哪個版本)。這是因爲較新版本的Socketio客戶端以Gevent Socketio無法識別的方式格式化它們的GET和POST請求,並且服務器只是假定它們是正常的Django請求並且沒有完成握手(這就是爲什麼在環境中不是'socketio'鍵)。

你應該做的,但在技術上沒有第二件事情,就是將它添加到你的根URL的conf:

import socketio.sdjango 
socketio.sdjango.autodiscover() 

這會自動查找所有的命名空間(在sockets.py)並註冊,同時將您的第一線的護理:

socketio_manage(...) 

如果由於某種原因,命名空間不被自動註冊,也可能因爲你沒有命名空間的裝飾添加到每個命名空間。在你的情況下,只要確保你的代碼相匹配的以下內容:

from socketio.sdjango import namespace 

@namespace('/chat') 
def ChatNamespace(...): 
    ... 

@namespace('/other') 
def OtherNamespace(...): 
    ... 

據我所知,這個問題是近兩年了,但我最近通過這些同樣的問題的工作。因此,對於任何在將來遇到此問題的人,請考慮這個答案。