Flask + Socketio-如何在路由内而不是在socketio函数内加入房间

问题描述

我无法理解以下代码为何不起作用。用户登录后,我想根据该用户的电子邮件创建一个房间。我尝试了两种不同的方法。首先,我尝试调用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","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);
});