Django 频道实时聊天:AttributeError:“消息”对象没有属性“as_dict”

Posted

技术标签:

【中文标题】Django 频道实时聊天:AttributeError:“消息”对象没有属性“as_dict”【英文标题】:Django Channels Live Chat: AttributeError: 'Message' object has no attribute 'as_dict' 【发布时间】:2018-02-26 19:51:37 【问题描述】:

我一直在按照本教程在我的 Django 项目中实现实时聊天系统。到目前为止一切顺利,我已经解决了所有出现的问题,但这个问题难倒了我。

2018-02-26 19:45:34,241 - ERROR - worker - Error processing message with consumer TestApp.consumers.ws_receive:
Traceback (most recent call last):
  File "/home/.virtualenvs/blog/lib/python3.5/site-packages/channels/worker.py", line 46, in run
consumer(message)
  File "/home/.virtualenvs/blog/lib/python3.5/site-packages/channels/sessions.py", line 57, in inner
return func(message, *args, **kwargs)
  File "/home/blog_dev/TutorsTalk/TestApp/consumers.py", line 23, in ws_receive
Group('chat-'+label).send('text': json.dumps([m.as_dict()]))
AttributeError: 'Message' object has no attribute 'as_dict'

这个错误似乎只在接收到 websocket 数据时出现,这就是为什么当我尝试发送数据时它被保存到数据库中的原因。这意味着如果我在另一个浏览器上打开它或刷新页面,我可以阅读这些消息。我还可以说我的断开代码也可以工作,因为在 Django 开发控制台中,它会告诉我 IP 何时与 websocket 断开连接。

您可能会说我对此很陌生。这是我在 consumer.py 中的代码

@channel_session
def ws_receive(message):
    label = message.channel_session['room']
    room = Room.objects.get(label=label)
    data = json.loads(message['text'])
    m = room.messages.create(handle=data['handle'], message=data['message'])
    Group('chat-'+label).send('text': json.dumps([m.as_dict()]))

我尝试了一些我认为可能有效但无济于事的方法。请告诉我是否应该提供更多信息。

【问题讨论】:

【参考方案1】:

m 是模型的实例所以下面的方法将对象转换为字典

 1. m.__dict__
    > Group('chat-'+label).send('text': json.dumps(m.__dict__))

 2. from django.forms.models import model_to_dict
    model_to_dict(m)
    > Group('chat-'+label).send('text': json.dumps(model_to_dict(m)))

【讨论】:

【参考方案2】:

您可以看到here Message 类中没有定义as_dict 方法。

如果要获取消息内容,可以访问Message实例的.content属性,获取Message内容dict。 (这在Message 类文档字符串中提到)

修复

Group('chat-'+label).send('text': json.dumps(m.content))

【讨论】:

【参考方案3】:

我按照该教程进行操作。将此行粘贴到模型消息上。

@property
def formatted_timestamp(self):
    return self.timestamp.strftime('%H:%M:%S')

def as_dict(self):
    return 'handle': self.handle, 'message': self.message, 'timestamp': self.formatted_timestamp

它会起作用的

【讨论】:

以上是关于Django 频道实时聊天:AttributeError:“消息”对象没有属性“as_dict”的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Schema Design - 实时聊天

Django 频道中的消费者

Django Channel实时推送与聊天

实时聊天问题(django/js)

使用 django 频道时如何使用频道而不是组?

我想用 React 和 Django 制作一个用户到用户的私人实时聊天应用程序