Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

8.6 Работа с WebSocket
5 из 5 шагов пройдено

Обработка событий во внешнем интерфейсе

Измените {% block script %} в файле chat/home.html, для этого удалим следующий код, отвечающий за отправку сообщений:

        websocket.onopen = function (event) {
            console.log('client says connection opened')
            websocket.send("Client sends Welcome")
        }
        websocket.onmessage = function (event) {
            console.log("client says server message received: ", event)
        }

И добавим следующие функции:

        websocket.onopen = function (event) {
            console.log("Connection Open")

        }

        websocket.onmessage = function (event) {
            /*Вызывается, когда сервер веб-сокета отправляет сообщение клиентскому веб-сокету*/
            message = JSON.parse(event.data)
            type = data.type
            data = message.data
            switch (type) {
                case "leave_group":
                    leave_group_handler(data)
                    break;
                case "join_group":
                    join_group_handler(data)
                    break;
            }
        }


        function leave_group_handler(uuid) {
            /*Удалит кнопки "Покинуть" и "Открыть" и создаст новую кнопку "Присоединиться"*/
            var leave_button = document.getElementById(`leave-${uuid}`)
            var open_button = document.getElementById(`open-${uuid}`)
            leave_button.remove()
            open_button.remove()
            var button = `<button id="join-${uuid}" class="group_option" value="join_group ${uuid}">Join</button>`
            var dev_body = document.getElementById(uuid)
            dev_body.innerHTML += button
            add_event_to_all_buttons()
        }


        function join_group_handler(uuid) {
            /*Удалит кнопку "Присоединиться" и добавит кнопку "Уйти" и "Открыть"*/
            var leave_button = document.getElementById(`join-${uuid}`)
            leave_button.remove()
            var button = `<button id="leave-${uuid}" class="group_option" value="leave_group ${uuid}">Leave</button>`
            var open_button = `<button id="open-${uuid}" class="group_option" value="open_group ${uuid}">Open</button>`

            var dev_body = document.getElementById(uuid)
            dev_body.innerHTML += button
            dev_body.innerHTML += open_button
            add_event_to_all_buttons()
        }

В результате {% block script %} будет выглядеть следующим образом:

{% block script %}
    <script>
        base_url = `${window.location.hostname}:${window.location.port}/`

        const websocket = new WebSocket(`ws://${base_url}`)


        function add_event_to_all_buttons() {
            /*Добавим прослушиватель событий, который отправляет сообщение о событии на все кнопки*/
            const keys = document.querySelectorAll('.group_option');
            keys.forEach(item => {
                    item.addEventListener('click', send_event_message)
                }
            )
        }


        function send_event_message(event) {
            /*Отправим uuid и значение кнопки, которая была нажата*/
            const {target} = event;
            group = target.value.split(" ")
            group_uuid = group[1]
            action = group[0] //Leave or Join or Open
            if (action == "open_group") {
                window.location.replace(`http://${base_url}groups/${group_uuid}/`)
            } else {
                data = {
                    "type": action,
                    "data": group_uuid,
                }
                websocket.send(JSON.stringify(data))
            }
        }

        add_event_to_all_buttons()


        websocket.onopen = function (event) {
            console.log("Connection Open")

        }

        websocket.onmessage = function (event) {
            /*Вызывается, когда сервер веб-сокета отправляет сообщение клиентскому веб-сокету*/
            message = JSON.parse(event.data)
            type = data.type
            data = message.data
            switch (type) {
                case "leave_group":
                    leave_group_handler(data)
                    break;
                case "join_group":
                    join_group_handler(data)
                    break;
            }
        }


        function leave_group_handler(uuid) {
            /*Удалит кнопки "Покинуть" и "Открыть" и создаст новую кнопку "Присоединиться"*/
            var leave_button = document.getElementById(`leave-${uuid}`)
            var open_button = document.getElementById(`open-${uuid}`)
            leave_button.remove()
            open_button.remove()
            var button = `<button id="join-${uuid}" class="group_option" value="join_group ${uuid}">Join</button>`
            var dev_body = document.getElementById(uuid)
            dev_body.innerHTML += button
            add_event_to_all_buttons()
        }


        function join_group_handler(uuid) {
            /*Удалит кнопку "Присоединиться" и добавит кнопку "Уйти" и "Открыть"*/
            var leave_button = document.getElementById(`join-${uuid}`)
            leave_button.remove()
            var button = `<button id="leave-${uuid}" class="group_option" value="leave_group ${uuid}">Leave</button>`
            var open_button = `<button id="open-${uuid}" class="group_option" value="open_group ${uuid}">Open</button>`

            var dev_body = document.getElementById(uuid)
            dev_body.innerHTML += button
            dev_body.innerHTML += open_button
            add_event_to_all_buttons()
        }
    </script>
{% endblock script %}

 В зависимости от type сообщения, отправляемого серверной частью, клиент вызывает метод join_group_handler либо метод leave_group_handler. Эти обработчики обновляют пользовательский интерфейс страницы.
 

Сейчас мы можем запустить сервер и перейти на главную страницу. Видео работы вы можете посмотреть по этой ссылке.


Нажимая на кнопки Join и Leave мы видим как мы вступаем и выходим из группы чатов. При этом если мы посмотрим админ панель, то увидим что у нас создаются события:


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

смешно просто!

 

16 минут назад

у меня нет кнопок вообще 


 

No Name

36 секунд назад

Разобрался, авторы внесите это в лекцию!!!

Дело в том что в админке надо создавать группы а этого в лекциях нет по этому пришлось код весь перепроверить и потом уже с админкой играться пожалуйста добавьте этот момент в лекцию иначе ничего не понятно!



ахаххахах

Разобрался, авторы внесите это в лекцию!!!

Дело в том что в админке надо создавать группы а этого в лекциях нет по этому пришлось код весь перепроверить и потом уже с админкой играться пожалуйста добавьте этот момент в лекцию иначе ничего не понятно!

у меня нет кнопок вообще 

 

Нажимая на кнопки Join и Leave мы видим как мы вступаем и выходим из группы чатов. При этом если мы посмотрим админ панель, то увидим что у нас создаются события:

@No_Name, Вот тут мы добавляли шаблон с кнопками.

Изменен Илья Перминов

@Илья_Перминов, эта страничка не найдена (((

в админке надо создавать группы так то весь код работает!

@No_Name, Ссылку исправил, про группы написано в этой же лекции.

@No_Name, И давайте не будем спамить в комментарии, нажимайте кнопку ответить, а не создавайте новый комментарий.

вы пишите и добавим следующую обработку!

а куда добавлять в новый {% block script %} или в тот самый {% block script %}??????

И добавим следующую обработку:

{% block script %}
    <script>
        base_url = `${window.location.hostname}:${window.location.port}/`

        const websocket = new WebSocket(`ws://${base_url}`)


        function add_event_to_all_buttons() {
            /*Добавим прослушиватель событий, который отправляет сообщение о событии на все кнопки*/
            const keys = document.querySelectorAll('.group_option');
            keys.forEach(item => {
                    item.addEventListener('click', send_event_message)
                }
            )
        }

@No_Name, поправил в лекции.

у меня нет кнопок на главной странице лишь большая надпись их и не было еще!

 

 В зависимости от type сообщения, отправляемого серверной частью, клиент вызывает метод join_group_handler либо метод leave_group_handler. Эти обработчики обновляют пользовательский интерфейс страницы.
 

Сейчас мы можем запустить сервер и перейти на главную страницу. Видео работы вы можете посмотреть по этой ссылке.

вот тут ничего не понятно вообще!

так что нужно сделать удалить тот кусок и остальной вставить или все заменить новым кодом ? ничего не ясно вообще!

 

Обработка событий во внешнем интерфейсе

Измените websocket.onmessage в файле chat/home.html, для этого удалим следующий код, отвечающий за отправку сообщений:

        websocket.onopen = function (event) {
            console.log('client says connection opened')
            websocket.send("Client sends Welcome")
        }
        websocket.onmessage = function (event) {
            console.log("client says server message received: ", event)
        }


И добавим следующую обработку:

{% block script %}
    <script>
        base_url = `${window.location.hostname}:${window.location.port}/`

        const websocket = new WebSocket(`ws://${base_url}`)


        function add_event_to_all_buttons() {
            /*Добавим прослушиватель событий, который отправляет сообщение о событии на все кнопки*/
            const keys = document.querySelectorAll('.group_option');
            keys.forEach(item => {
                    item.addEventListener('click', send_event_message)
                }
            )
        }

Сначала была ошибка 

'Group' object has no attribute 'members_set'
Во views изменил messages = group.members_set.all()
На messages = group.members.all()

Теперь эта ошибка

Изменен Попов Станислав

@Попов_Станислав, вместо members нужно было message написать, ошибся

Почему при нажатии на кноку join, нужно обновлять страницу, чтобы увидеть Leave / open
А если нажимать leave, носки обновляются сразу

Ошибка в браузере 
TypeError: null is not an object (evaluating 'leave_button.remove')

Изменен Попов Станислав

@Попов_Станислав, загрузите проект по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрим в чём проблема.

в файле cunsumers.py

в методе join_group, словарь data['data'] было значение 'group_uuid' в виде str, а нужно было передать переменную group_uuid

@Попов_Станислав, ага, я так понимаю сами разобрались?) Я поправил в вашем проекте 'data': group_uuid и все заработало.

И еще, в файле home.html, из за косой черты переноса ( \ ), у меня в кнопках она выводится.

                <button id="leave-{{group.uuid}}" class="group_option" value="leave_group {{group.uuid}}">\
                Leave</button>

Поменяйте на это:

                    <button id="leave-{{ group.uuid }}" class="group_option" value="leave_group {{ group.uuid }}">
                        Leave
                    </button>

@Илья_Перминов, да, благодарю

Изменен Попов Станислав