目前我看到以下库可用于使用带有烧瓶的websockets:
然而,gevent-websockets尚未兼容python3(至少它不能通过pip安装)。这使得其他2也无法使用。
使用带有烧瓶的腹板有其他替代方法吗?或龙卷风是最佳选择?
答案 0 :(得分:8)
首先,请注意Flask-SocketIO与其他两个不同。它包装了Socket.IO协议,而不是原始的WebSocket。这使它能够支持使用HTTP长轮询模拟的类似WebSocket的接口,用于不支持WebSocket协议的客户端。
说到Flask-SocketIO,请注意此扩展即将进行大修。
目前的官方发布(0.6)取决于gevent,gevent-socketio和gevent-websocket。不幸的是,作为一个项目的gevent-socketio早已不复存在,并且卡在Socket.IO协议的一个非常旧的版本上,这迫使你使用一个古老的Javascript客户端。
即将推出的Flask-SocketIO 1.0版本是一个完全重写版本,主要与0.6版本兼容,但它支持Python 2和Python 3,并且采用了允许不同机制用于网络和并发的设计。版本0.6的gevent-socketio依赖性被替换为两个名为python-socketio和python-engineio的新包,它们实现了当前版本的Socket.IO协议,并支持所有官方Socket.IO客户端(Javascript ,Swift和C ++)。
就低级依赖性而言,基本上有三种选择:
Eventlet
在Py2和Py3上,Eventlet是迄今为止性能最高且最稳定的选项。 WebSocket支持是eventlet的原生支持,因此只需在virtualenv中安装eventlet,即可使Flask-SocketIO以最佳配置工作。
gevent和gevent-websocket
如果出于任何原因你更喜欢gevent,那也可以,但在我的测试中,它的效果不如eventlet。如果你想在使用gevent时访问WebSocket,那么你还需要安装包gevent-websocket。 gevent和gevent-websocket都已移植到Python 3,但它太新了。
Werkzeug(或任何其他多线程WSGI兼容服务器)
您还可以使用Flask自己的网络服务器。在此模式下,扩展仅适用于长轮询模式。与其他两个相比,性能显然很糟糕,但是对于开发和调试来说,能够让所有工作都运行而不必运行eventlet或gevent,并带来所有复杂性,这是很好的。
截至今天(2015年10月4日),新的Flask-SocketIO扩展版有一个功能齐全的测试版。官方发布即将推出。您可以使用以下命令安装测试版:
pip install flask-socketio==1.0b1
代码在git repo的1.0分支上可用:https://github.com/miguelgrinberg/Flask-SocketIO/tree/v1.0。
免责声明:我相信现在已经很清楚,但为了以防万一,请注意我是Flask-SocketIO,python-socketio和python-engineio的作者。