目前我看到以下库可用于在flask中使用websockets:
- flask-sockets(可能已经废弃)
- flask-SocketIO
- getevent -websockets(以上2个依赖于此)
然而,geevent -websockets还不兼容python3(至少它不能通过pip安装)。这使得另外两个也无法使用。
是否有其他选择使用websockets与flask?还是说龙卷风是最好的选择?
首先,请注意Flask-SocketIO与其他两个不同。它封装了Socket。IO协议,而不是原始的WebSocket。这使它能够支持一个类似WebSocket的接口,通过HTTP长轮询模拟不支持WebSocket协议的客户端。
说到Flask-SocketIO,请注意这个扩展即将进行重大改革。
当前的官方版本(0.6)依赖于gevent, geevent -socket和geevent -websocket。不幸的是,event-socketio作为一个项目已经死亡很久了,并且停留在一个非常旧的Socket版本上。IO协议,它迫使您使用旧的Javascript客户端。
即将发布的Flask-SocketIO版本1.0是一个完全重写的版本,与0.6版本基本兼容,但它支持Python 2和Python 3,并且采用了允许不同机制用于网络和并发的设计。版本0.6中的geevent -socketio依赖被两个名为python-socketio和python- engineeio的新包所取代,它们实现了当前版本的Socket。IO协议,并支持所有官方Socket。IO客户端(Javascript, Swift和c++)。
对于低级依赖,您基本上有三个选项:
-
Eventlet
在Py2和Py3上,Eventlet是迄今为止性能最好、最稳定的选项。WebSocket支持是原生的eventlet,所以只要在你的虚拟环境中安装eventlet, Flask-SocketIO就可以在最优配置下工作。 -
gevent and geevent -websocket
如果出于某种原因您更喜欢gevent,那也可以,但在我的测试中,它的性能不如eventlet。如果你想在使用gevent时访问WebSocket,那么你还需要安装包geevent - WebSocket。gevent和geevent -websocket都已移植到Python 3,但这都是最近的事情。
-
Werkzeug(或任何其他多线程WSGI兼容服务器)
你也可以使用Flask自己的web服务器。在此模式下,扩展仅在长轮询模式下工作。与其他两个相比,性能显然很糟糕,但对于开发和调试来说,能够让一切都工作是很好的,而不必运行eventlet或gevent,以及它们带来的所有复杂性。
pip install flask-socketio==1.0b1
代码可在git的1.0分支:https://github.com/miguelgrinberg/Flask-SocketIO/tree/v1.0.
免责声明:我相信现在已经很清楚了,但为了以防万一,请注意我是Flask-SocketIO, python-socketio和python- engineeio的作者。