使用Flask-Socketio和Vue发送私人消息

时间:2020-07-13 10:43:47

标签: python vue.js flask

我正在尝试通过使用Flask-socketIO将朋友的请求/消息从一个客户端发送到另一个特定的客户端。
我一直遵循https://www.youtube.com/watch?v=mX7hPZidPPYInstant messaging with Flask-socketIO后端的说明 对于https://www.youtube.com/watch?v=JEYEpledOxs

的前端

前端(Vue)

当我激活登录功能时,用户名最终出现在后端“ socket_users”字典中。然后将其路由到“发送消息”页面,该页面上带有“ send_message”的按钮。 当我单击“ send_message”按钮时,消息应发送到指定的客户端“ user2”

登录页面
我按下登录将用户发送到socketIO的页面

   methods: {
      login(){   
           self.privatesocket.emit('username',self.username_login);
         }
       }
  
    created(){
      this.socket = io("http://127.0.0.1:5000")
      this.privatesocket = io("http://127.0.0.1:5000/private")
    }

发送消息页面
页面,如果我单击按钮,则将运行“发送消息”功能,然后将消息发送到另一个客户端(“ user2”)

methods: {
    send_message(){ 
      var res = [{'username': 'user2'}, {'message': "want to be friends?"}]
      this.privatesocket.emit('private_message',res);
      }
  },
  created(){
    this.socket = io("http://127.0.0.1:5000")
    this.privatesocket = io("http://127.0.0.1:5000/private")
  }

 mounted(){
    this.privatesocket.on('new_private_message', data =>{
       this.$alert("Friend request")
    });
  }

当我发送给每个人时,发送给其他客户端没有问题,但是当我在"room=recipient_session_id"中包含"@socketio.on('private_message', namespace ='/private')"时,什么也没发送。

后端
在我的python脚本中,我实例化了应用程序和socketio,如下所示。

app = Flask(__name__, static_folder = "static")
app.config['SECRET_KEY'] = 'secretkey'
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resources={r"/": {"origins": origin_var}})

socketio = SocketIO(app, cors_allowed_origins="*")

socket_users = {}   //Socket_users is the dictionary where I input the users that will be using the socket.

以下代码在socket_users词典中输入用户和sid。

@socketio.on('username',namespace ='/private')
def receive_username(username):
    socket_users[username] = request.sid

下面的代码是我检查用户是否在socket_users词典中的地方。

@socketio.on('private_message', namespace ='/private')
def private_message(payload):
    recipient_session_id = socket_users[payload[0]['username']]
    message = payload[1]['message']
    emit('new_private_message', {"message":message},room=recipient_session_id)

如果我运行以下命令,则不会收到针对特定收件人在客户端运行的警报,但是如果我全部添加broadcast = True或一起删除“ room = recipient_session_id”,那么它将起作用。

问题
如何获取要发送给特定收件人的邮件?

0 个答案:

没有答案