【问题标题】:Multiple namespace in gevent-socketio on djangodjango 上的 gevent-socketio 中的多个命名空间
【发布时间】:2014-05-14 10:16:25
【问题描述】:

我设法制作了一个类似于 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'

【问题讨论】:

    标签: python django gevent-socketio


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2012-11-13
      • 2021-04-06
      相关资源
      最近更新 更多