【发布时间】:2013-08-21 13:51:07
【问题描述】:
我将 Flask 与 gevent-socketio 一起使用:
$ cat requirements.txt
Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.3
argparse==1.2.1
gevent==0.13.8
gevent-socketio==0.3.5-rc2
gevent-websocket==0.3.6
greenlet==0.4.1
itsdangerous==0.23
wsgiref==0.1.2
我正在使用非常标准的设置来启动服务器:
#Called from __main__
def run_dev_server():
app.debug = True
port = 5000
dapp = werkzeug.debug.DebuggedApplication(app, evalex = True)
SocketIOServer(('', port), dapp, resource="socket.io").serve_forever()
还有一个用于我的 SocketIO 命名空间的非常标准的钩子:
@app.route('/socket.io/<path:rest>')
def push_stream(rest):
print 'ws connect', rest
try:
socketio.socketio_manage(request.environ, {'/join_notification': JoinsNamespace}, request)
except Exception as e:
app.logger.error("Exception while handling socketio connection", exc_info=True)
return flask.Response()
但是,我遇到了客户端未触发“连接”事件的问题。经过一番挖掘,我意识到即使在输出中收到127.0.0.1 - - [2013-08-19 12:53:57] "GET /socket.io/1/websocket/170191232666 HTTP/1.1" 101 - - 消息,我也没有收到ws connect 消息(而代码中的其他打印语句工作正常)。我注释掉了那个端点,果然它甚至没有被调用。这可以解释为什么我的命名空间没有被使用。但为什么?我注册命名空间有误吗?
print app.url_map 产生:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> root>,
<Rule '/socket.io/<rest>' (HEAD, OPTIONS, GET) -> push_stream>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
所以没什么特别的。
编辑:客户端代码:
socket = io.connect('/join_notification')
console.log(socket)
socket.on('connect', function() {
console.log('connected to websocket')
socket.emit('login', {'name': data['name']})
})
socket.on('disconnect', function() {
console.log('d/c\'d from websocket')
})
socket.on('join_error', function() {
...
})
socket.on('join_success', function(data){
...
})
socket.on('join', function(data) {
...
})
【问题讨论】:
-
同时发布客户端代码
-
添加了客户端代码。
-
如果您在调用 connect 时收到 /socket.io/1/
,则说明您做错了。 Connect 应该通过 POST 调用到 /socket.io/1/ 。通过省略下一段,您正在启动一个新的连接。因此,您要么已连接,并且最后收到带有“stuff”的响应,这意味着它有效 - 或者您启动连接错误。现在,如果它正在工作并且没有调用您的代码,您确定您正确初始化了您的命名空间吗? gevent-socketio.readthedocs.org/en/latest/namespace.html -
问题是我应该拦截socket.io调用以注册我的命名空间的函数从未被调用。将 POST 添加为允许的方法并没有帮助,因为 SocketIOServer 会在 /socket.io* 的请求甚至到达 WSGI 应用程序之前拦截它们。
标签: python web websocket socket.io flask