what's the Flask-SocketIO
Flask 是一个同步的轻量级框架,主要提供最基本的 api 接口功能,表现形式主要是服务端被动接收客户端的请求后做出响应,然后客户端根据响应结果做出业务操作。但是业务领域繁杂,会遇到需要服务端主动发送消息,客户端被动接收的情形,这个时候第一反应会想到的是使用 WebSocket 。若是出现服务端既要主动发送又要被动接收的情形,Flask-SocketIO 就是个不错的选择。
Flask-SocketIO 和 WebSocket 都是长连接,也就是说服务端和客户端握手成功后就可以持续通讯。WebSocket 是 HTML5 中实现了服务端和客户端进行双向文本或二进制数据通信的一种新协议,其实已经低于 HTTP 协议本身,和 HTTP 本质上没有什么关系。不过形式上两者略有相似。WebSocket 的连接地址基本格式:ws://localhost:8080。
WebSocket 在连接建立阶段通过 HTTP 的握手方式进行,这可以看做是为了兼容浏览器或者使用一些现成的功能来实现。当连接建立之后,客户端和服务端之间就不再进行 HTTP 通信,所有信息交互都由 WebSocket 接管。
从资源占用的角度上来说,其实 WebSocket 比 ajax 占用的资源更多,但它真正实现了全双工通信这一点还是很理想的,意味着无论是前端还是后端的信息交互程序编写都会变得更加方便。
Flask-SocketIO 使 Flask 应用程序可以让客户端和服务器之间实现低延迟双向通信。 客户端应用程序可以使用任何 SocketIO 官方客户端库,或任何兼容的客户端来建立与服务器的永久连接。
安装及依赖
pip install flask-socketio
Flask-SocketIO兼容Python 2.7和Python 3.3+。这个软件包所依赖的异步服务可以从以下三种选择中选择:
- eventlet 是最好的高性能选项,支持长轮询和 WebSocket 传输。
- gevent 支持多种不同的配置。 long-polling 传输完全由 gevent 包支持。与 eventlet 不同的是 gevent 没有原生的 WebSocket 支持。为了添加对 WebSocket 的支持,目前有两种选择:
- 安装 gevent-websocket 软件包
- 使用随 WebSocket 功能一起提供的uWSGI Web 服务器。 gevent 的使用也是一个性能选项,但比eventlet略低。
- 使用基于 Werkzeug 的 Flask 开发服务器,相比上述两项而言会降低一些性能,因此只能用于简化开发流程。该选项仅支持长轮询传输。
优先考虑 eventlet,接着是 gevent。对于 gevent 中的 WebSocket 支持,首选 uWSGI,然后是 gevent-websocket。如果既没有安装 eventlet 也没有安装 gevent,则使用Flask开发服务器。
注意:Flask-SocketIO 不会调用 before_request 和 after_request,也就是说如果 Flask-SocketIO 和 Flask 结合使用,那么 before_request 和 after_request 只能约束普通的 Flask 接口
简单的例子
from flask import Flask, render_template from flask_socketio import SocketIO app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) if __name__ == '__main__': socketio.run(app) # socketio.run()函数封装了Web服务器的启动,代替了app.run()标准的Flask开发服务器启动。 当应用程序处于调试模式时,Werkzeug开发服务器仍在socketio.run()中使用和正确配置。 在生产模式下首选使用eventlet Web服务器,否则使用gevent Web服务器。 如果没有安装eventlet和gevent,则使用Werkzeug开发Web服务器。