项目场景:
在Flask项目中建立socketio服务
app = create_app()
socketio = SocketIO(app, cors_allowed_origins='*')
socketio.run(app, port=8080, debug=True, use_reloader=False)
想在各个模块中都可以调用socketio的服务,这种消息就可以在任意地方广播出去
from manager import socketio
sockeio.emit("xxx")
问题描述
most likely due to a circular import
在其他模块中引入socketio实例,会报以上错误,这个叫引入循环错误
sockeio.emit("xxx")
以上消息发送不起作用,甚至没有报错
原因分析:
解决引用问题可以在函数局部引用
发送socket消息的时候需要上下文环境,app.app_context()
解决方案:
提示:manager文件是我实例化socketio的地方, 然后在a文件使用socket发送消息
- 直接在manager文件中封装一个函数,假设为push_data()
def push_data(data):
with app.app_context():
socketio.emit('push', {'data': data})
- 在a文件的导入push_data函数并调用
def b():
from manager import push_data
push_data("haha")