我在 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 等一样工作。
提前致谢!
您正在将消息发送到房间,因此房间中的所有人员都会收到它们。相反,将消息发送给正在进入房间的用户:
for message in messages:
emit("message", {"username": message.user.username, "message": message.message}, to=request.sid)