【问题标题】:Notification from Flask to JS using socket.IO使用 socket.IO 从 Flask 到 JS 的通知
【发布时间】:2020-05-15 22:21:22
【问题描述】:

我正在使用工作正常的 Flask-SocketIO 库,但我需要向 socket.io 装饰器的外部发送带有 emit 的通知,这真的很痛苦。查看解决方案,很多人使用rabbitmq或redis,但我不知道如何使用它们。

这是我的代码:

from flask import Flask, render_template
from flaskwebgui import FlaskUI
from flask_socketio import SocketIO, emit

app = Flask(__name__)
async_mode = None
app.config['SECRET_KEY'] = 'hello'
socketio = SocketIO(app, async_mode=async_mode, message_queue='amqp:///socketio')

def run_sock(): 
    socketio.run(app, debug=True)

ui = FlaskUI(app, fullscreen=True, server=run_sock,)

@app.route("/")
def index():  
    return render_template('index.html')

@socketio.on('test', namespace='/test')
def test():
    print("test")

if __name__ == "__main__":
    ui.run()
    io = SocketIO(message_queue='amqp:///socketio')
    io.emit('test_emit', {'data': 'toto'}, namespace='/test')

我的 JS 前端从来没有收到 test_emit 消息,我该怎么办?

【问题讨论】:

    标签: python flask socket.io flask-socketio


    【解决方案1】:

    您的 emit 问题在于它出现在 ui.run() 调用下方,直到您关闭应用程序才会返回。将 emit 移至应用程序中在服务器运行时执行的任何函数(例如 Flask 视图函数),它应该可以正常工作。

    为什么同一进程中有两个SocketIO 对象?您在脚本顶部附近定义的socketio 实例可以在流程中的任何位置使用,无需创建第二个实例。你不需要使用消息队列来解决这个问题,因为你在一个进程中拥有了 Socket.IO 的所有用法。

    【讨论】:

    • 您好,感谢您的回复。以上是我的应用程序的一个简单示例。当我的系统上发生操作时(例如,绑定 USB 密钥),我需要在 javascript 中警告前面。所以我不能在ui.run() 启动之前发射。
    • 当然。把它放在 ui.run() 之前也行不通。它需要在您的应用程序运行时发出,而不是之前和之后。正如我所说,它必须放在一个在您的应用程序正在运行时执行的函数中,例如视图函数。
    猜你喜欢
    • 2018-01-17
    • 2020-09-24
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多