使用socket.IO从Flask向JS发送通知

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

我使用的是Flask-SocketIO库,效果很好,但是我需要用emit发送一个通知到socket.io装饰器的外面,这真的很麻烦。看了一下解决方案,很多人使用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个回答
0
投票

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

为什么你有两个 SocketIO 在同一过程中,对象? socketio 实例可以在进程中的任何地方使用,不需要创建第二个实例。你不需要为这个问题使用消息队列,因为你在一个进程中使用了Socket.IO的所有用法。

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