Несколько пространств имен в Gevent-Socketio на Django

Мне удалось создать приложение, похожее на пример чата django в gevent-socketio. Однако, когда я добавляю пространство имен (класс) в 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'

1 ответ

Есть несколько странных вещей, которые вы должны понять, чтобы Gevent Socketio работал с Django.

Первое, что вы должны сделать, это убедиться, что вы используете клиент Socketio версии 0.9.6 (в исходном коде должно быть указано, какую версию вы используете). Это связано с тем, что более новые версии клиента Socketio форматируют свои запросы GET и POST способом, который Gevent Socketio не распознает, а сервер просто предполагает, что они являются обычными запросами 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(...):
    ...

Я понимаю, что этому вопросу уже почти два года, но я недавно решил эти проблемы. Так что рассмотрите этот ответ для тех, кто сталкивается с этим в будущем.

Другие вопросы по тегам