通过Websocket从Python Flask服务器连续向客户端发送数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Websocket从Python Flask服务器连续向客户端发送数据相关的知识,希望对你有一定的参考价值。
我正在设置一个仪表板,该仪表板需要Python Flask服务器每隔几秒钟左右获取一次公共传输数据,然后通过websocket将这些数据发送到客户端网页。我正在使用FlaskSocketIO实现此目的。
例如,我能够在'connect'
事件后发送消息,但是我一直无法找到一种持续更新此消息的方法。这是我的方法:
from flask import Flask, render_template, url_for, request
from flask_socketio import SocketIO, emit, send
import eventlet
eventlet.monkey_patch()
app = Flask(__name__)
socketio = SocketIO(app, logger=True, engineio_logger=True)
def listen():
while True:
message = # some updating message
emit('message', message)
socketio.sleep(1)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def handle_connect():
listen()
if __name__ == "__main__":
socketio.run(app, debug=True)
记录器说它发送了消息。但是,在客户端,没有收到消息。客户端javascript是:
var socket = io();
socket.on('message', function(msg)
console.log(msg);
);
我也遇到了同样的问题,在我的情况下,我想更新传感器仪表板,因此我研究了观察者模式,此链接非常好Observer Pattern。使用SocketEmitObservator,使用观察者,您不需要创建侦听器(无限的while循环)并使您的代码更清晰:
class SensorObserver(Observer):
sensor_id: int
sid = ''
def __init__(self, sid,sensor_id=None):
Observer.__init__(self)
self.sensor_id = sensor_id
self.sid = sid
SensorPublisher().attach(self)
def update(self, sensorData: DataModel) -> None:
socket.emit("info",
'sensor': subject,
namespace='/api/sector/machine',
room=self.sid)
def __del__(self):
SensorPublisher().detach(self)
class SensorPublisher(Subject, Singleton):
_observers: List[SensorObserver] = []
_sensorData: Dict[str, DataModel] =
def attach(self, observer: SensorObserver) -> None:
if observer not in self._observers:
self._observers.append(observer)
def notify(self, sensorModel: DataModel) -> None:
for observer in self._observers:
if sensorModel.sensor_id == observer.sensor_id:
observer.update(sensorModel)
def detach(self, observer: SensorObserver) -> None:
if observer in self._observers:
ob = self._observers.pop(self._observers.index(observer))
del ob
def update(self, sensorModel: DataModel):
sendorId: str = str(sensorModel.sensor_id)
self._sensorData[sendorId] = sensorModel
self.notify(sensorModel)
#### And in the place where i update sensor data i put
SensorPublisher().update(dataStructList)
#### To create a observr just do
@socketio.on('connect')
def handle_connect():
SensorObserver(self.sid, item)
就我而言,我这样使用,但您可以适应您的问题
您不能在连接处理程序中添加while True
循环,因为这将阻止连接处理程序返回并建立连接。
您可以作为建立连接后客户端发送的另一个事件的响应,也可以启动实现此循环的后台任务。连接处理程序需要快速返回以允许连接发生。
以上是关于通过Websocket从Python Flask服务器连续向客户端发送数据的主要内容,如果未能解决你的问题,请参考以下文章
从python代码连接到Flask websocket [重复]
flask python geventwebsocket实现websocket
python-flask复习——- flask请求上下文源码解读http聊天室单聊/群聊(基于gevent-websocket)