2017-08-31 13 views
1

我嘗試創建按照Django documentation使用WebSockets支持的Django。我希望收到消息,將其保存到我的PostgreSQL數據庫並將響應發送給同一用戶。此時消息可能與收到的一樣。我嘗試做如下所示的方式,但我得到:如何基於帶PostgreSQL數據庫的WebSockets創建簡單的Django聊天?

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'] 
) 
+0

你看到什麼信息['text']是 – single430

+0

我發送的只是簡單的字符串。 – wahtdbogh

+0

打印消息,輸入(消息)多次嘗試message.content ['text'] – single430

回答

2

試試這個:

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) 

更新的解決方案

+0

使用你的'msg_consumer',我得到了與更新後的問題相同的錯誤:'django_1 |從無 提升JSONDecodeError(「Expecting value」,s,err.value)django_1 | json.decoder.JSONDecodeError:期望值:第1行第1列(char 0) ' – wahtdbogh

+0

@Wahtdbogh,請提供您的「消息」變量中包含的內容。 –

+0

你的意思是'msg_consumer'中的print(「message」+ message)'? – wahtdbogh

0
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'], 
    }) 

你試試,如果不行,我不知道,對不起

+0

我已更新我的帖子。 – wahtdbogh