我使用的是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消息,怎么办?
你的emit的问题是它出现在下面的 ui.run()
调用,直到您关闭应用程序才返回。将 emit 移动到您的应用程序中任何在服务器运行时执行的函数(如 Flask 视图函数),它应该可以正常工作。
为什么你有两个 SocketIO
在同一过程中,对象? socketio
实例可以在进程中的任何地方使用,不需要创建第二个实例。你不需要为这个问题使用消息队列,因为你在一个进程中使用了Socket.IO的所有用法。