重新加载页面时聊天消息重复 - Flask 聊天应用程序

问题描述 投票:0回答:1

我在 Flask 中创建了一个聊天应用程序,可以选择与你的朋友私信。消息从数据库保存和加载。但是,当您刷新页面时,它会复制所有消息并将它们发送给其他用户,请注意,它不会在数据库中创建条目。

@socketio.on('message')
def handle_message(data):
    username = data.get('username')
    message = data.get('message')
    room = data.get('room')

    # Save the message to the database
    if room in rooms():
        new_message = Message(
            user_id=current_user.id,
            room_id=room,
            message=message
        )
        db.session.add(new_message)
        db.session.commit()

    # Broadcast the message to all participants in the room
    emit("message", {"username": username, "message": message}, to=room)
        
@socketio.on('join')
def on_join(data):
    username = data.get('username')
    room = data.get('room')
    
    # Join the room
    join_room(room)
    
    # Load messages for the room from the database
    messages = Message.query.filter_by(room_id=room).all()
    
    # Emit each message to the user who joined the room
    for message in messages:
        emit("message", {"username": message.user.username, "message": message.message}, to=room)

问题在于,每次用户刷新页面时,用户都会重新加入房间。 (我相信)

我尝试了socketio.emit和socketio.send,但是没有什么区别。我有点卡住了,希望得到一些帮助。

我希望消息加载一次,当我刷新页面时,它不应该向其他用户发送垃圾邮件。它应该像任何其他消息应用程序、discord、skype 等一样工作。

提前致谢!

python flask flask-sqlalchemy flask-socketio
1个回答
0
投票

您正在将消息发送到房间,因此房间中的所有人员都会收到它们。相反,将消息发送给正在进入房间的用户:

    for message in messages:
        emit("message", {"username": message.user.username, "message": message.message}, to=request.sid)
© www.soinside.com 2019 - 2024. All rights reserved.