Как сделать чат на Django + Channels + WebScockets

291
01 февраля 2018, 20:17

Здравствуйте, мне нужна помощь с созданием чата. Использую Channels для обработки WebSockets. С документацией этого пакета я разобрался, мне нужна помощь во фронтенде. Backend:

# -*- coding: utf8 -*-
# consumers.py
import json
from channels import Group

def receive(message):
    """Принимает объекты JSON сообщения и отправляет их клиенту.
    Все что в print'e - дебаг сообщения в консоли
    """
    txt = message.content['text']
    Group('chat').send({
        'text': json.dumps({
            'msg': txt
        })
    })
    print 'Got WebSockets message ' + txt

def connect(message):
    """Подкдючает пользователя к группе "chat"
    """
    message.reply_channel.send({"accept": True})
    Group('chat').add(message.reply_channel)
    print 'Connection established'

def disconnect(message):
    """Удаляет юзера из чата
    """
    Group('chat').discard(message.reply_channel)
    print 'User left'

Frontend:

//index.html
<div class="wrapper">
    <div id="chat"></div>
    <form id="form" action="">
        <input id="msg" type="text" placeholder="type message">
        <input id="submit" type="submit" value="send">
    </form>
</div>

JavaScript

// main.js
$(function () {
    var socket = new WebSocket('ws://' + window.location.host + '/chat/');
    console.log("Connection established");
    var chat = $('#chat');
    var message = $('#msg').val();
    socket.onmessage = function (e) {
        chat.append(e.data)
    };
    socket.onopen = function (msg) {
        msg = message;
        socket.send(JSON.stringify(msg))
    };
    if (socket.readyState === WebSocket.OPEN) socket.onopen();
});
Answer 1
<div id="messages"></div>
<form>
    <label for="text">Text:</label>
    <textarea id="text" name="text" cols="50" rows="8"></textarea>
    <button id="send">Send</button>
</form>
var messages = document.getElementById("messages");
var text = document.getElementById("text");
var button = document.getElementById("send");
var socket = new WebSocket("ws://" + window.location.host + "/chat/");
socket.onmessage = function(e) {
    var message = document.createElement("p");
    var data = JSON.parse(e.data);
    message.innerHTML = data.user + ": " + data.text;
    messages.appendChild(message);
}
button.addEventListener("click", function(event) {
    event.preventDefault();
    socket.send(text.value);
    text.value = '';
});
READ ALSO
Vuejs асинхронный зарпрос

Vuejs асинхронный зарпрос

Проблема с асинхронными запросамиВ хранилище vuex указано, какой элемент выпадающего списка должен быть загружен по умолчанию

242
Имитация keyup в поле ввода

Имитация keyup в поле ввода

Создаю расширение для автоматизации действий на страницеНе удается сымитировать keyup

236
Можно ли создавать звуки в JS?

Можно ли создавать звуки в JS?

Дамы и Господа, возник вопрос, можно ли на JS создавать звуки? Помню в детстве, я писал код на basic-ке, когда еще IBM 386 или IBM 486, был мечтой мечтой...

205