2015-03-13 60 views
0

我尝试使用gevent.socketio与我的TurboGears 2网址:的TurboGears与GEVENT-socketio:请求键错误

在ini文件我用

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

当我尝试访问控制器在web浏览器:

@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的旧版本,我也试过this模块,但总是出现同样的错误。 我是相当新的插座,所以也许我只是失去了一些东西明显

回答

0

的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) 
+0

这就是为什么在https://github.com/amol-/tgext.socketio实例安装在'socketio'路径'socket.io'控制器的原因。如果你想实际上将它作为'/ socket.io'来提供,你可以使用'app_cfg.py'中的'disable_request_extensions'和'dispatch_path_translator'选项来实现它。 – amol 2015-03-15 22:01:08