2

我设法制作了一个类似于 gevent-socketio 的 django 聊天示例的应用程序。但是,当我在 sockets.py 中添加命名空间(类)时,出现 socketio 错误:'no_such_namespace'。

我需要添加

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

在我看来,但后来我有以下 KeyError:

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

1 回答 1

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(...):
    ...

我知道这个问题已经有将近两年的历史了,但我最近也解决了同样的问题。因此,对于将来偶然发现此问题的任何人,请考虑此答案。

于 2016-05-07T12:09:14.853 回答