Несколько пространств имен в 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(...):
...
Я понимаю, что этому вопросу уже почти два года, но я недавно решил эти проблемы. Так что рассмотрите этот ответ для тех, кто сталкивается с этим в будущем.