【问题标题】:Flask socketio, how to create room per user?Flask socketio,如何为每个用户创建房间?
【发布时间】:2021-01-28 14:07:13
【问题描述】:

我正在创建一个通知服务,并且需要将一个用户存储在一个房间中,以便向他发送通知到所有打开的选项卡。 我怎样才能把每个房间的用户?我有授权,用户有用户名,如何为用户名创建房间 mb,然后使用 socketio.send(broadcast=True) 将用户通知发送到所有用户选项卡。

这里有一些 Python 代码:

@login_required
@app.route('/test', methods=['GET', 'POST'])
def test():
    return render_template('test.html',username=current_user.username)

@socketio.on('message')
def message(data):
username = current_user.username
send(data, broadcast=True)

@socketio.on('join')
def join():
    """User joins a room"""
username = current_user.username
room_name = current_user.username + "room"
print('ROOM NAME',room_name)
room = room_name
join_room(room)
send(username + ' has entered the room.', room=room)

这里是 JavaScript 代码:

document.addEventListener('DOMContentLoaded', () => {

    socket.on('connect', () => {
        socket.send("Iam connected");
        socket.emit('join', {});
    });

    socket.on('message',data => {
        const p = document.createElement('p');
        const br = document.createElement('br');
        p.innerHTML = data;
        document.querySelector('#display-message-section').append(p);
    });

    document.querySelector('#send_message').onclick = () => {
        socket.send(document.querySelector('#user_message').value);
    }
})

【问题讨论】:

    标签: python flask socket.io flask-sqlalchemy


    【解决方案1】:

    问题在于我脑海中的房间介绍。我像这样更改了 Python 代码:

    @login_required
    @app.route('/test', methods=['GET', 'POST'])
    def test():
    return render_template('test.html', username=current_user.username)
    @socketio.on('message')
    def on_message(data):
    """Broadcast messages"""
    
    room = current_user.username + '`s room'
    send(data, broadcast=True, room=room)
    
    @socketio.on('join')
    def on_join(data):
    """User joins a room"""
    
    username = current_user.username
    room = current_user.username + '`s room'
    join_room(room)
    send({"msg": username + " has joined the " + room}, room=room)
    
    @socketio.on('leave')
    def on_leave(data):
    """User leaves a room"""
    
    username = current_user.username
    room = current_user.username + '`s room'
    leave_room(room)
    send({"msg": username + " has left the room"}, room=room)
    

    和这样的 JavaScript 代码:

    document.addEventListener('DOMContentLoaded', () => {
    
        // Connect to websocket
        var socket = io.connect('http://' + document.domain + ':' + location.port);
        let room = "Lounge"
        joinRoom("Lounge");
    
        socket.on('connect', function () {
            socket.send("Iam connected");
            joinRoom(room);
        });
    
        socket.on('message',data => {
            console.log(data);
            const p = document.createElement('p');
            const br = document.createElement('br');
            p.innerHTML = data;
            document.querySelector('#display-message-section').append(p);
        });
    
        function joinRoom(room,username) {
            socket.emit('join', {});
        }
    
        document.querySelector('#send_message').onclick = () => {
            socket.send(document.querySelector('#user_message').value);
        }
    })
    

    对我来说它有效,我保存了当前用户的用户名+“房间”之类的房间,并在创建后加入它。在点击新登录用户的链接“/test”之后,将创建新房间。我还添加了room=roomsend() (send(data, broadcast=True, room=room)),指出数据只能在这个房间发送。

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2016-05-05
      • 2018-06-18
      相关资源
      最近更新 更多