19.从Flask-SocketIO 0.x 升级到 1.x 和 2.x 版本

优质
小牛编辑
128浏览
2023-12-01

老版本的Flask-SocketIO有完全不同的一系列依赖包。老版本依赖gevent-socketio和gevent-websocket,这些包 1.0 版本都不需要了。

尽管依赖的改变,但是 1.0 版本却没有太多重要的改变。下面是一个实际改变的详细的清单:
* 1.0 版本放弃支持Python 2.6,增加了对Python 3.3, Python 3.4 和 pypy 的支持。
* 0.x 版本需要老版本的Socket.IO javascript客户端。从 1.0 版本开始,支持新发布的Socket.IO和Engin.IO。1.0版本以前的Socket.IO将不再被支持。Swift和C++官方的 Socket.IO客户端也被支持。
* 0.x 版本依赖gevent,gevent-socketio和gevent-websocket.1.0 版本以后将不再使用。在Flask开发的网络服务器中,gevent是三种后端网络服务器选择之一,另外两个是eventlet和其它常规多线程WSGI 服务器。
* Socket.IO服务器选项在 1.0 版本中也有所改变。它们可以由SocketIO构造函数来提供,或者由run()调用。这些选项在使用前在这两者中被合并。
* 0.x 版本暴露了gevent-socketio在连接中作为request.namespace。在 1.0 版本中它不再被使用。这个请求对象定义了request.namespace作为待处理的命令空间。并且增加了request.aid,为客户端连接定义了一个独有的会话ID,request.event包含了活动名称和参数。
* 为了获得房间列表,0.x版本需要应用使用私有gevent-socketio结构,包含request.namespace.rooms表达式。这是在 1.0 版本中将不再出现,因为它包含了一个合适的room()函数。
* 这个推荐的“把戏(trick)”发送消息到一个独立的客户端将消息分发到每个客户端所在的独立的房间内,这个地址消息对应着目的房间(desired room)。这个特性在 1.0 版本中被正式化了,当客户端连接到服务器时,它会立即自动地被分配到一个特定的房间内。
* 全局命名空间的connect活动在 1.0 版本之前并没有被触发。这bug已经被修复了并且按照预期触发。
* 在 1.0 版本增加了对客户端的回调函数的支持。

为了升级到新的Flask-SocketIO版本,你需要升级你的Socket.IO客户端到兼容Socket.IO 1.0 协议。对于Javascript客户端,1.3.x和1.4.x版本经过充分地测试,发现是兼容的。

在服务端,有一些要点是要被考虑到的:
* 如果你想继续使用gevent,那么gevent-socketio需要从你的虚拟环境中卸载,因为这个包将不再需要并且可能会与它的替代——python-socketio相冲突。
* 如果你想轻微地提高性能和稳定性,那么推荐你转而使用eventlet。为了做到这一点,需要卸载gevent、gevent-socketio和gevent-websocket,然后安装eventlet。
* 如果你的应用使用了猴子修复了并转向了eventlet,需要调用eventlet.monkey_patch()来代替gevent中的monkey.patch_all()。此外,任何对gevent的调用必须被同等条件下的对eventlet调用替代。
* 任何使用request.namespace需要被直接调用Flask-SocketIO函数替代。例如,request.namespace.rooms要用rooms()函数替换。
* 任何使用内置的gevent-socketio的对象都必须被去除,当这个包不再是所需的依赖的时候。