Flask SocketIO дублирует сохраненные сообщения - PullRequest
0 голосов
/ 08 мая 2020

Я создаю чат-приложение только на основе 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)

Визуальное представление происходящего

что фактическая ошибка:

1 Ответ

0 голосов
/ 09 мая 2020

Функция 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)
...