flask_socketio模块实际上是封装了flask对websocket的支持,websocket在连接建立阶段是通过HTTP的握手方式进行的,这可以看做是为了兼容浏览器或者使用一些现成的功能来实现,这样一种捷径。当连接建立之后,客户端和服务端之间就不再进行HTTP通信了,所有信息交互都由websocket接管。Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信,使客户端建立与服务器的永久连接。
flask_socketio适用于后台产生新的数据,需要在前台页面马上展示出来,例如数据监控、统计图实时变化更新等。
首先我们安装模块
pip install flask_socketio
SocketIO发送消息
SocketIO可以使用send()和emit()函数向连接的客户端发送消息,两个函数有些区别,send()用于发送未命名事件消息,而emit()用于发送已命名事件消息。
一个简单使用SocketIO的完整实例
#!/usr/bin/python3 #coding:utf-8 from flask import Flask,render_template from flask_socketio import SocketIO from threading import Thread import random app = Flask(__name__) app.config['SECRET_KEY'] = 'test' socketio = SocketIO(app) async_mode = None thread = None @app.route("/") def index(): return render_template("index.html") @socketio.on("connect", namespace="/test_conn") def test_connect(): global thread if thread is None: thread = socketio.start_background_task(target=background_thread) def background_thread(): while True: socketio.sleep(3) t = random.randint(1000,9999) socketio.emit('server_response', {'data': t}, namespace='/test_conn') if __name__ == "__main__": socketio.run(app, debug=True)
页面模版:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>test socket</title> <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script> <script src="{{ url_for('static', filename='js/socket.io.min.js') }}"></script> </html> <body> <p id="t"></p> <script> $(function(){ namespace = '/test_conn'; var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace); socket.on('server_response', function(res) { console.log(res.data); $('#t').text(res.data); }); }); </script> </body> </html>
网上有很多时时推送的例子只是将test_connect函数中的内容使用while进行无限循环来时时推送到前台,但是在实际测试中这种方式前台无法获取到数据,可能导致这种情况是由于服务端进入死循环后影响了socket和客户端的通信,所以这里我们起一个后台线程去进行无限循环推送信息