Flask使用flask_socketio将信息时时推送前台

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和客户端的通信,所以这里我们起一个后台线程去进行无限循环推送信息

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/618.html