Турбокомпрессоры с gevent-socketio: ошибка запроса ключа

Я пытаюсь использовать gevent.socketio с моим веб-сайтом TurboGears 2:

в ini-файле, который я использую

[server:main]
use = egg:gevent-socketio#paster
transports = xhr-multipart, xhr-polling, websocket
host = 0.0.0.0
port = 8080

когда я пытаюсь получить доступ к контроллеру в веб-браузере:

@expose('wago.templates.test')
def index(self):
  socketio_manage(request.environ, {"/stat": StatNamespace}, request=request) 
  return dict()

я получаю следующую ошибку:

Traceback (most recent call last):
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/wsgiapp.py", line 105, in __call__
response = self.wrapped_dispatch(controller, environ, context)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/wsgiapp.py", line 278, in dispatch
return controller(environ, context)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/controllers/dispatcher.py", line 132, in __call__
response = self._perform_call(context)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/controllers/dispatcher.py", line 113, in _perform_call
r = self._call(func, params, remainder=remainder, context=context)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/controllers/decoratedcontroller.py", line 120, in _call
output = controller_caller(context_config, bound_controller_callable, remainder, params)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/decorators.py", line 42, in _decorated_controller_caller
return application_controller_caller(tg_config, controller, remainder, params)
File "/home/pi/tgenv/lib/python2.7/site-packages/tg/configuration/app_config.py", line 124, in call_controller
return controller(*remainder, **params)
File "/home/pi/tgenv/WAGO/wago/controllers/root.py", line 13, in index
socketio_manage(request.environ, {"/stat": StatNamespace}, request=request)
File "/home/pi/tgenv/lib/python2.7/site-packages/socketio/__init__.py", line 67, in socketio_manage
socket = environ['socketio']
KeyError: 'socketio'

Я использовал несколько руководств по пирамиде, чтобы познакомиться с gevent-socketio. Я пробовал его со старыми версиями от TurboGears2, gevent и gevent-socketio, я также пробовал этот модуль но всегда одна и та же ошибка. Я новичок в сокетах, поэтому, возможно, я просто упускаю что-то очевидное.


person Doomsel    schedule 13.03.2015    source источник


Ответы (1)


gevent-socketio распознает запросы сокетов только с определенного URL-адреса (socket.io/1/), потому что TurboGears использует имена функций python в качестве URL-адреса, который нам не подходит "." или "1" обычным способом. Простое решение:

    @expose()
    def _default(self, *args):
      args = list(args)
      if "socketio" in request.environ:
        #do socketio stuff...
      else:
        abort(404)
person Doomsel    schedule 14.03.2015
comment
По этой причине в github.com/amol-/tgext.socketio примеры монтируются контроллер socket.io на пути socketio. Если вы действительно хотите использовать его как /socket.io, вы можете использовать параметры disable_request_extensions и dispatch_path_translator в app_cfg.py, чтобы это произошло. - person amol; 16.03.2015