Flask 断开与客户端的连接

Flask 断开与客户端的连接,flask,flask-socketio,Flask,Flask Socketio,我正在使用flask socketio制作聊天应用程序,现在我想在客户端断开连接时,即当客户端关闭浏览器/选项卡时,向服务器发送一条带有客户端用户名的消息,以便我可以将该消息从服务器发送到所有现有客户端,以便他们更改在线好友列表。我已经在谷歌上搜索了两个多小时,我所接近的任何东西都是,但对我来说都不起作用。我在服务器端通过以下方式获得了flask socketio文档,但我不知道哪个客户端断开了连接,因此无法更改在线好友列表 @socketio.on('disconnect') def test

我正在使用flask socketio制作聊天应用程序,现在我想在客户端断开连接时,即当客户端关闭浏览器/选项卡时,向服务器发送一条带有客户端用户名的消息,以便我可以将该消息从服务器发送到所有现有客户端,以便他们更改在线好友列表。我已经在谷歌上搜索了两个多小时,我所接近的任何东西都是,但对我来说都不起作用。我在服务器端通过以下方式获得了flask socketio文档,但我不知道哪个客户端断开了连接,因此无法更改在线好友列表

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')
    emit('client disconnected','a client disconnected but I dont know who',broadcast = True) # i have imported emit 
    # but since i don't know which client disconnected i couldn't emit client name above.
所以,我认为最好像下面这样从客户端发送消息,但在客户端关闭浏览器后,服务器不会收到该消息:

// handle disconnect
socket.on('disconnect',()=>{
      socket.emit('client disconnected',{'username':localStorage.getItem('username')})
})

我是flask socketio的新手,非常感谢您的帮助。

您可以在卸载前使用
on
事件。当浏览器选项卡或窗口关闭、尝试导航离开页面或重新加载页面时,将触发此事件

客户端:


window.onbeforeunload=函数(){
emit('client_disconnecting',{'username':localStorage.getItem('username')});
}
服务器端:

@socket.on('client\u disconnecting')
def断开连接详细信息(数据):
打印(f'{data['username']}用户已断开连接。“)

使用烧瓶“请求”对象。您的服务器代码如下所示:

from flask import Flask, request
...
users = {} # rudimentary dict, but use your preferred user management system
@socketio.on('connect')
def connect():
    users[request.sid] = User()
... # I assume some code would go here for users to set/update their display names
@socketio.on('disconnect')
def disconnect():
    emit(
        'user disconnected', 
        {'user_id': request.sid, 'message': users[request.sid].username+' disconnected'}, 
        broadcast=True
    )

想法是在用户连接时将sid分配给他们,这样,您可以通过其ID访问其显示名称。

您可以使用
request.sid
来了解哪个用户已断开连接。是的,我可以通过该ID查看ID,但我也想获取断开连接的客户端的用户名,就像客户端在断开连接后发送一样。