Flask + Socketio - 如何加入路由内的房间(不在 socketio 函数内)

Flask + Socketio - How do I join a room inside a route (not inside a socketio function)

我无法理解为什么我的以下代码不起作用。当用户登录时,我想根据该用户的电子邮件创建一个房间。我尝试了两种不同的方法。首先,我尝试调用 join 或 join_room,两者均无效。当我尝试 socketio.join(email) 时,出现错误提示 socketio 没有连接,当我尝试 socketio.join_room(email) 时,我也出现错误。

@app.route("/login", methods=["GET", "POST"])
   def login():
      ...
      if userisloggedin:
         socketio.join(email) # OR socketio.join_room(email)

我尝试的第二种方法是从函数发出并单独创建房间:

@app.route("/login", methods=["GET", "POST"])
   def login():
      ...
      if userisloggedin:
         socketio.emit("privatemsg", email, namespace="/messages") 
 
@socketio.on("privatemsg", namespace="/messages")
   def gotMessage(email):
      print("JJJJJJJ")
      socketio.join_room(email)
      

当用户登录时,服务器应该打印“JJJJJJJ”,但是没有出现!

您需要配置客户端以接收 privatemsg 发出事件并随后将其发送回服务器,但回调最适合此目的

@app.route("/login", methods=["GET", "POST"])
def login():
    ...
    if userisloggedin:
        socketio.emit("privatemsg", email, callback=gotMessage, namespace="/messages") 
 
def gotMessage(email):
    print("JJJJJJJ")
    socketio.join_room(email)

在您的客户端执行此操作:

var socket = io();
socket.on('privatemsg', (email, gotMessage) => {
    gotMessage(email);
});