如何使用 PostgreSQL 数据库创建基于 WebSockets 的简单 Django 聊天?

How can I create simple Django chat based on WebSockets with PostgreSQL database?

我尝试根据 Django documentation 使用 WebSockets 创建支持的 Django。我想接收消息,将其保存到我的 PostgreSQL 数据库并将响应发送给同一用户。此时消息可能与收到的消息相同。我尝试按照下面显示的方式进行操作,但我得到:

django_1  | 2017-08-31 08:30:52,050 - ERROR - worker - Error processing message with consumer backend.consumers.msg_consumer:
django_1  | Traceback (most recent call last):
django_1  |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 119, in run
django_1  |     consumer(message, **kwargs)
django_1  |   File "/code/backend/consumers.py", line 11, in msg_consumer
django_1  |     message=message.content['message'],
django_1  | KeyError: 'message'

routing.py:

from channels.routing import route
from backend.consumers import ws_connect, ws_receive, ws_disconnect, msg_consumer

channel_routing = [
    route("websocket.connect", ws_connect),
    route("websocket.receive", ws_receive),
    route("websocket.disconnect", ws_disconnect),
    route("chat", msg_consumer),
]

models.py:

from django.db import models

class Message(models.Model):
    message = models.CharField(max_length=200)

consumers.py:

from channels import Group
from .models import  Message
from channels import Channel
import json


# Connected to chat-messages
def msg_consumer(message):
    # Save to model
    Message.objects.create(
        data=json.loads(message['text']),
        message = data['message']
    )
    # Broadcast to listening sockets
    Group("chat").send({
        "text": message.content['message'],
    })

# Connected to websocket.connect
def ws_connect(message):
    # Accept the connection
    message.reply_channel.send({"accept": True})
    # Add to the chat group
    Group("chat").add(message.reply_channel)

# Connected to websocket.receive
def ws_receive(message):
    Channel("chat").send({
        "text": message.content['text'],
    })
    print(message.content['text'])

# Connected to websocket.disconnect
def ws_disconnect(message):
    Group("chat").discard(message.reply_channel)

我改变了:

Message.objects.create(
    message=message.content['message'],
)

Message.objects.create(
    data=json.loads(message['text']),
    message = data['message']
)
def msg_consumer(message):
    # Save to model
    Message.objects.create(
        message = message.content['text']
    )
    # Broadcast to listening sockets
    Group("chat").send({
        "text": message.content['text'],
    })

你试试,如果不行,我不知道,抱歉

试试这个:

from channels import Group
from .models import Message
from channels import Channel


def msg_consumer(message):
    text = message.content.get('text')
    Message.objects.create(
        message=text,
    )
    Group("chat").send({'text': text})


def ws_connect(message):
    message.reply_channel.send({"accept": True})
    Group("chat").add(message.reply_channel)


def ws_receive(message):
    Channel("chat").send({
        "text": message.content['text'],
    })


def ws_disconnect(message):
    Group("chat").discard(message.reply_channel)

更新解决方案