【问题标题】:Flask SocketIO duplicating saved messagesFlask SocketIO复制保存的消息
【发布时间】:2020-05-08 13:18:33
【问题描述】:

我正在构建一个仅基于 Flask SocketIO 的聊天应用程序,没有数据库。其中一项要求是当新用户连接时,应用程序应显示以前的消息。我将每条消息保存到每个发送事件的数组中。好的,所以现在的问题是,当用户 A 连接并创建一些消息,然后用户 B 连接时,会显示用户 B 之前的所有消息,但随后用户 A 也收到了这些消息,因此用户 A 最终得到了重复的消息。

客户端 JS

function myFunction() {
    document.getElementById('demo').style['text-decoration']='underline';
  }
  const socket = io.connect("http://127.0.0.1:5000");

socket.on('connect', function() {

  socket.emit('sync_messages');
  socket.emit('sync_channels');

});

Flask 应用代码

    @socketio.on('sync_messages')
def handle_sync():
    socketio.emit('show_all_messages', messages)

@socketio.on('sync_channels')
def handle_sync_channels():
    socketio.emit('show_all_channels', channels)

正在发生的事情的可视化表示

what the actual bug is

【问题讨论】:

    标签: python flask socket.io flask-socketio python-socketio


    【解决方案1】:

    socketio.emit() 函数不支持上下文,它默认广播给所有连接的用户。尝试使用 emit() 这是 Flask 友好的包装器:

    @socketio.on('sync_messages')
    def handle_sync():
        emit('show_all_messages', messages)
    
    @socketio.on('sync_channels')
    def handle_sync_channels():
        emit('show_all_channels', channels)
    

    【讨论】:

    • 哇,它的创造者本人!!!请原谅我,但是 emit 和 socketio.emit 之间到底有什么区别
    • socketio.emit() 函数相当通用,并非特定于 Flask。您可以将此函数视为实际完成工作的内部函数。 emit() 函数是这个扩展的公共函数。它是 Flask 特定的,使用请求上下文为您的发出添加合理的默认值,当然还调用 socketio.emit() 来执行工作。当您使用emit() 时,诸如命名空间和发出的接收者之类的东西会根据发送者获得默认值。希望这会有所帮助!
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-06-06
    • 2016-04-19
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多