Как передать сообщение на определенный URL-адрес с помощью JavaScript и Flask_socketio? - PullRequest
0 голосов
/ 01 октября 2019

Я создаю службу обмена онлайн-сообщениями (по духу похожую на Slack) и хочу видеть широковещательные сообщения только тогда, когда посещаю URL-адрес, на котором было опубликовано сообщение. В настоящее время сообщение отправляется по всем каналам (URL).

Я попытался добавить пространство имен:

@socketio.on('submit message', namespace='/channel/0')

, но сообщения не проходят.

Я также пытался добавить информацию '/ channel / 0' кsocket

var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + '/channel/0');

, но сообщение все равно будет отправлено на канал / 1.

@app.route("/channel/<int:channel_id>")
def channel(channel_id):
    channel_name = channels[channel_id]
    messages = chat_messages[channel_id]
return render_template('channel.html', channel_name=channel_name, messages=messages, channel_id=channel_id)

@socketio.on('submit message')
def chat(data):
    # Retrieve data from form
    display_name = data['display_name']
    content_typed = data['content_typed']
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    channel_id = int(data['channel_id'])

    # Add message to list
    chat_messages[channel_id].append( {'display_name' : display_name,'content_typed':content_typed,
     'timestamp': timestamp } )

    # Display last message
    emit("All messages", chat_messages[channel_id][-1], broadcast=True)

document.addEventListener('DOMContentLoaded', () => {
// connect to websocket
        var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);

 // when connected configure submit button to submit new messages
        socket.on('connect', () => {
            document.querySelector('#form_channel').onsubmit = () => {
                const content_typed = document.querySelector('#message').value;
                const display_name = localStorage.getItem('user');
                const channel_id = document.querySelector('#channel_id').value;
                socket.emit('submit message', {'display_name' : display_name,'content_typed':content_typed,'channel_id': channel_id});
                document.querySelector('#message').value = '';

                return false;
            };

            return false;
        });

        // // When a new message is created, add to the unordered list
        socket.on('All messages', data => {
            const p = document.createElement('p')
            p.innerHTML = `from ${data.display_name} on ${data.timestamp}: ${data.content_typed} `;
            document.querySelector('#chatroom').append(p)
        })
    });

Когда пользователь отправляет сообщение во время посещения URL канала / 0, я хочу толькочтобы увидеть его по этому URL, а не по другим (например, channel / 1). Если я обновлю страницу, сообщение будет правильно сохранено по правильному маршруту, проблема с трансляцией.

1 Ответ

0 голосов
/ 08 октября 2019

Мне удалось решить мою проблему, создав 2 разных сокета: один, который связывается со всеми каналами, а другой, который только отправляет сообщение на канал, был получен из.

@socketio.on('submit message')
def chat(data):
    # Retrieve data from socket

    # Add message to list

    # Display last message
    emit("All messages", chat_messages[channel_id][-1], namespace=f'/channel/{channel_id}', broadcast=True)

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

        var channel_id = document.querySelector('#channel_id').value;
        var socket2 = io.connect(location.protocol + '//' + document.domain + ':' + location.port + `/channel/${channel_id}`);
...
socket2.on('All messages', data => {
            ...
        });
}
...