我如何将广播消息从另一个班级与Flask的socektio一起发送给所有客户端

问题描述 投票:0回答:2

我正在尝试在文件系统中的文件更改时向所有客户端发送通用广播消息。

有效方法:

  • 广播一般消息效果很好。

    socketio.emit('refresh_request', "A broadcasted message received by all clients", callback=messageReceived, broadcast=True)

  • 通过控制台中的看门狗库获取有关文件系统更改的通知。

    事件类型:修改后的路径:C:\ appFilesToMonitor \ afile_Copy.py

问题

我必须从文件监视器处理程序中发送广播消息。如果我在此类中执行socketio.emit(),则会在控制台中收到错误消息:

文件“ C:\ Tools \ Programming \ Python37-32 \ lib \ site-packages \ flask \ globals.py”,第38行,在_lookup_req_object中引发RuntimeError(_request_ctx_err_msg)RuntimeError:在请求上下文之外工作。

这通常意味着您尝试使用所需的功能活动的HTTP请求。查阅有关测试的文档有关如何避免此问题的信息。

我以为我必须以某种方式向该类提供socketio对象。我尝试了一个回调函数,并尝试传递socketio对象。但无济于事。我的灵感耗尽了,很明显我不明白。

程序的相关部分:

让我知道是否需要更多

app = Flask(__name__)
socketio = SocketIO(app)

def file_change_broadcast_callback(msg):
    app.logger.warning("*********testing broadcast************")
    socketio.emit('refresh_request', msg, callback=messageReceived, broadcast=True)

class MyHandler(FileSystemEventHandler):
    def __init__(self, sio, callback_function):
        self.sio = sio
        self.callback_function = callback_function

    def on_modified(self, event):
        print(f'--------------------------file change event type: {event.event_type}  path : {event.src_path}')

        # not working
        # emit_arguments = {"status": "refresh_request", "msg":"yooo de mannen"}
        # socketio.emit('refresh_request', emit_arguments, callback=messageReceived, broadcast=True)

        # not working (nothing received by clients)  (error: RuntimeError: Working outside of request context.)
        # self.sio.emit('refresh_request', "msg", callback=messageReceived, broadcast=True)

        # not working (error: RuntimeError: Working outside of request context.)
        # self.callback_function("The filesystem has been changed.")


if __name__ == "__main__":
        ...
        event_handler = MyHandler(socketio,file_change_broadcast_callback)
        observer = Observer()
        observer.schedule(event_handler, path=str(Path( app.config['webapp']['base_folder'])), recursive=True)
        observer.start()
        ...

问题:

如何将广播消息从另一个班级发送给所有客户端。 (在这种情况下:如果文件在文件系统中发生了更改)

python flask socket.io flask-socketio watchdog
2个回答
0
投票

当您尝试访问上下文Flask变量时会发生此错误,通常在后台任务中会发生此错误,但是您可以使用以下方法在Endpoint外部使用Flask上下文:

with app.test_request_context():
   socketio.emit('refresh_request', msg, callback=messageReceived, broadcast=True)

0
投票

使用:创建SocketIO实例

socketio = SocketIO(app, async_mode='threading')

((向Flask, Python and Socket.io: multithreading app is giving me "RuntimeError: working outside of request context"致谢,尼古拉斯R对伯顿的回答发表评论)

并发出:

class MyHandler(FileSystemEventHandler):
    def __init__(self):
        pass
    def on_modified(self, event):
        print(f'--------------------------file change event type: {event.event_type}  path : {event.src_path}')
        socketio.emit('refresh_request', "files changed warning.", broadcast=True)


现在所有作品。

© www.soinside.com 2019 - 2024. All rights reserved.