因为需要做到客户端和服务端长期连接,并且服务端需要推送信息到客户端,于是采用了 WebSocket 的方式。
Python 下面有很多 WebSocket 的封装库,但是考虑到我还是使用 Flask 的情况,就使用 Flask-SocketIO 吧。
官方的使用文档很详细,国内还有中文版,所以如何新建 Flask-SocketIO 的项目,我就不说了。移步下面的链接:
以下是使用中碰到的一些情况
Flask-SocketIO 始终使用 Pulling 方式。
- 检查是否安装了 gevent-websocket 因为只有这个支持 websocket。
- 检查代码
socketio = SocketIO(app)
,里面不能包含async_mode
,或者async_mode ="gevent"
- 要修改客户端的链接代码,增加后面的 transports 参数
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace, {'path': '/conn', "transports":['websocket', 'polling']});
- 最后,需要在你的 nignx 中添加新的一段反向代理
location /socket.io {
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:5000/socket.io;
}
关于 SocketIO 路径问题
不是强迫症的可以忽略。
在建好服务端和客户端连接后,可以发现建立连接的地址是 http://127.0.0.1:5000/socket.io/?xxxx 这样的。中间的 socket.io 就是 socket.io 服务器的路径。官方文档是这样说的。所以我想修改它,其实不难,两个地方修改即可。
- 修改 python 里的初始化代码。增加 path 的参数值。
socketio = SocketIO(app, path = 'testpath')
- 同样要修改客户端代码,增加对应的 path 的参数值
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace, {'path': '/conn', "transports":['websocket', 'polling']});
以上是两个需要注意的地方。项目刚刚开始,如果碰到了什么坑,再来记录。