如何将flask-socketio用于没有http请求的python脚本

Posted

技术标签:

【中文标题】如何将flask-socketio用于没有http请求的python脚本【英文标题】:How to use flask-socketio for python scripts which do not have http request 【发布时间】:2017-06-25 23:46:49 【问题描述】:

我一直在关注this 和this 链接以在客户端和服务器之间进行通信。我的基本想法是弹出我目前从 app.py(我的烧瓶应用程序)发出的通知。但是,我也有单独的没有 http 请求的 python 脚本。我也想从这些脚本向客户端(浏览器)发送通知。所以我正在考虑从我的其他 python 脚本向 app.py 发送消息,并从 app.py 发出。有没有更好的选择来实现这一目标?

【问题讨论】:

【参考方案1】:

我正在考虑从我的其他 python 脚本向 app.py 发送消息并从 app.py 发出消息

Flask-SocketIO 实际上就是这样做的。

您必须运行一个消息队列,通常是 Redis 或 RabbitMQ,您的服务器和外部脚本都可以访问该队列。然后在您的服务器中,按如下方式创建您的 SocketIO 对象:

socketio = SocketIO(app, message_queue='redis://')

在您的脚本中,您可以按如下方式创建它:

socketio = SocketIO(message_queue='redis://')

显然,您可以更改消息队列 URL 以匹配您正在使用的内容。

第一个对象是一个完全启用的服务器,它附加到您的app Flask 实例。第二个是只能发出的“只写”对象,因为它没有被赋予附加的服务器)。

当您从外部脚本发出时,该脚本将向消息队列发布一条消息,该消息将被服务器拾取然后执行。

【讨论】:

如何访问消息队列中的数据? 您不必这样做,Flask-SocketIO 会为您处理队列中的写入和读取。 但它会写入一个数据两次,有时甚至是四次。所以我想检查 Flask-SocketIO 是否两次(四次)写入/读取数据,或者消息队列实际上有两次数据。这就是为什么我要访问消息队列中的数据。有什么方法可以检查吗? 这是一个名为flask-socketio 的常规发布-订阅频道。您可以订阅以查看队列中发生了什么,或使用任何 Redis 监控工具。 好的。谢谢你的主意。我可以在订阅 pub-sub 频道后看到数据。但是在浏览器上显示数据后,一旦我们重新加载浏览器,它就消失了。这是我主要关心的问题。有没有办法将数据临时存储在某个地方,以便即使在我重新加载网页后也可以将其显示回来?

以上是关于如何将flask-socketio用于没有http请求的python脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flask-SocketIO 修复此 KeyError 错误?

网站后端_Flask-第三方库.利用Flask-Socketio扩展构建实时流应用?

Flask-socketio,向另一个命名空间发出事件

Flask-SocketIO发送图像

如何在 docker 容器中设置 flask-socketio?

Python Flask-socketio 工作,没有从 JS 客户端接收数据