Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过WebSocket从Python Flask服务器持续向客户端发送数据_Javascript_Python_Flask_Websocket_Flask Socketio - Fatal编程技术网

Javascript 通过WebSocket从Python Flask服务器持续向客户端发送数据

Javascript 通过WebSocket从Python Flask服务器持续向客户端发送数据,javascript,python,flask,websocket,flask-socketio,Javascript,Python,Flask,Websocket,Flask Socketio,我正在设置一个仪表板,要求Python Flask服务器每隔几秒钟左右获取一次公共交通数据,并通过WebSocket将这些数据发送到客户端网页。我正在使用FlaskSocketIO来实现这一点 例如,我能够在'connect'事件时发送消息,但我无法找到持续更新此消息的方法。这是我的方法: 从烧瓶导入烧瓶,呈现模板,url,请求 从flask_socketio导入socketio,发射,发送 导入事件 eventlet.monkey_patch() app=烧瓶(名称) socketio=soc

我正在设置一个仪表板,要求Python Flask服务器每隔几秒钟左右获取一次公共交通数据,并通过WebSocket将这些数据发送到客户端网页。我正在使用FlaskSocketIO来实现这一点

例如,我能够在
'connect'
事件时发送消息,但我无法找到持续更新此消息的方法。这是我的方法:

从烧瓶导入烧瓶,呈现模板,url,请求
从flask_socketio导入socketio,发射,发送
导入事件
eventlet.monkey_patch()
app=烧瓶(名称)
socketio=socketio(应用程序,记录器=True,引擎记录器=True)
def listen():
尽管如此:
消息=#一些更新消息
发出('消息',消息)
socketio.睡眠(1)
@应用程序路径(“/”)
def index():
返回渲染模板('index.html')
@socketio.on('connect')
def handle_connect():
听
如果名称=“\uuuuu main\uuuuuuuu”:
运行(app,debug=True)
记录器说它发送了信息。但是,在客户端,没有收到任何消息。客户端JavaScript是:

var socket=io();
socket.on('message',函数(msg){
控制台日志(msg);
});

我和你有同样的问题,在我的例子中,我想更新传感器仪表板,所以我研究了观察者模式,这个链接非常好。使用观察者实现一个SocketEmitorObservator,你不需要创建一个监听器(无限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
循环,因为这将阻止连接处理程序返回并建立连接

您可以在建立连接后作为对客户端发送的另一个事件的响应来执行此操作,也可以启动实现此循环的后台任务。连接处理程序需要快速返回以允许连接发生