redis - 客户端没有从带有 Redis 消息队列的 Flask-SocketIO 服务器接收事件
问题描述
我想向我的 Flask-SocketIO 服务器添加多处理,所以我试图根据Flask-SocketIO docs添加一个 Redis 消息队列。即使不添加多处理,客户端也不会收到任何事件。其他一切工作正常(例如,正在提供网页,正在发出 HTTP 请求,正在发出数据库调用)。前端或后端没有错误消息。在我添加 Redis 队列之前,它正在工作。我验证了 'addname' SocketIO 路由被命中并且 request.sid 看起来正确。我究竟做错了什么?
非常简化的服务器代码:
external_sio = SocketIO(message_queue='redis://')
def requester(user, sid):
global external_sio
external_sio.emit('addname', {'data': 'hello'}, room=sid)
# do some stuff with requests and databases
external_sio.emit('addname', {'data': 'goodbye'}, room=sid)
def main():
app = Flask(__name__,
static_url_path='',
static_folder='dist',
template_folder='dist')
socketio = SocketIO(app)
@socketio.on('addname')
def add_name(user):
global external_sio
external_sio.emit('addname', {'data': 'test'}, room=request.sid)
requester(user.data, request.sid)
socketio.run(app, host='0.0.0.0', port=8000)
if __name__ == '__main__':
main()
简化的客户端代码(React Javascript):
const socket = SocketIOClient('ipaddress:8000')
socket.emit('addname', {data: 'somename'})
socket.on('addname', ({data}) => console.log(data))
解决方案
主服务器也需要连接到消息队列。在您的主服务器中执行以下操作:
socketio = SocketIO(app, message_queue='redis://')
在您的外部流程中执行以下操作:
external_sio = SocketIO(message_queue='redis://') # <--- no app on this one
推荐阅读
- dns - 如何将外部域指向 VPS 服务器
- django - /spotify/liked/ 处的 ValueError:无法分配“某些值”:“Liked_Songs.track_name”必须是“个人资料”实例
- algorithm - 找到最小化2个有序点列表之间的平均距离的最佳循环排列
- python - vue.js 和 python 脚本之间交互的最佳方式
- javascript - 出现错误:请求失败,状态码 404 在路由上的 createError (C:\Users\xxxxxxxxx\node_modules\axios\lib\core\createError.js:16:15)
- python - Pandas multiindex - 将自定义函数应用于金融时间序列
- php - 如何在创建站点的同一函数中获取站点 ID?
- autodesk-forge - 将项目管理员和用户添加到 bim360 项目时出错
- laravel - 如何使用 laravel 护照将用户从客户网站安全地连接到我的网站
- c++ - std::vector::swap 实际上是做什么的?