You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Channels报错ValueError:传入消息无'type'属性求助

问题:Django Channels 抛出 ValueError("Incoming message has no 'type' attribute")

问题代码

def receive(self, text_data=None, bytes_data=None):
    text_data_json = json.loads(text_data)
    message_type = text_data_json["type"]
    message = text_data_json["message"]
    if message_type == 'providerToAdmin':
        chat = Chats.objects.get(user=self.sender)
        Message.objects.create(text=message, date=datetime.datetime.now(), user_type=0, chat=chat)
        group_name = f'chat_{self.admin.username}'
        # self.send(text_data=json.dumps({'check': True, 'message': message}))
        async_to_sync(self.channel_layer.group_send)(
            group_name, {"userType": 0, "data": message, 'chatId': chat.id}
        )

    if message_type == 'adminToUsers':
        chat = Chats.objects.get(user=self.sender)
        Message.objects.create(text=message, date=datetime.datetime.now(), user_type=1, chat=chat)
        group_name = f'chat_{self.admin.username}'
        async_to_sync(self.channel_layer.group_send)(
            group_name, {"userType": 0, "data": message, 'chatId': chat.id}
        )

    if message_type == 'providerToStore':
        receiver = text_data_json["receiver"]
        receiver = Store.objects.get(user__username=receiver)
        provider = Provider.objects.get(user__username=self.sender)
        chat = ChatsSP.objects.get(store=receiver, provider=provider)
        MessageSP.objects.create(text=message, date=datetime.datetime.now(), user_type=1, chat=chat)
        group_name = f'chat_{receiver.user.username}'
        async_to_sync(self.channel_layer.group_send)(
            group_name, {"userType": 0, "data": message, 'chatId': chat.id}
        )

def chat_message(self, event):
    message = event["data"]
    name = event["name"]
    userName = event["userName"]
    chatId = event["chatId"]
    self.send(text_data=json.dumps({"message": message, 'name': name, 'userName': userName,
                                    'chatId': chatId
                                    }))

错误信息

raise ValueError("Incoming message has no 'type' attribute")

原因分析

Django Channels 通过channel_layer.group_send发送消息时,必须包含type字段,这个字段的值对应消费者中要调用的方法名(比如你的chat_message方法)。当前代码发送的消息字典里完全没有type字段,因此触发了该 ValueError。

另外,你的chat_message方法尝试读取event["name"]和event["userName"],但当前发送的消息里也没有这两个字段,即使解决了type的问题,后续也会抛出 KeyError。

解决方案

修改所有group_send的消息内容,添加type字段(值为chat_message),同时补充name和userName字段(根据业务逻辑填充对应值)。

修改后的代码示例:

def receive(self, text_data=None, bytes_data=None):
    text_data_json = json.loads(text_data)
    message_type = text_data_json["type"]
    message = text_data_json["message"]
    if message_type == 'providerToAdmin':
        chat = Chats.objects.get(user=self.sender)
        Message.objects.create(text=message, date=datetime.datetime.now(), user_type=0, chat=chat)
        group_name = f'chat_{self.admin.username}'
        async_to_sync(self.channel_layer.group_send)(
            group_name, {
                "type": "chat_message",  # 必须添加的type字段
                "userType": 0, 
                "data": message, 
                'chatId': chat.id,
                'name': self.sender.get_full_name(),  # 示例:填充发送者全名
                'userName': self.sender.username      # 示例:填充发送者用户名
            }
        )

    if message_type == 'adminToUsers':
        chat = Chats.objects.get(user=self.sender)
        Message.objects.create(text=message, date=datetime.datetime.now(), user_type=1, chat=chat)
        group_name = f'chat_{self.admin.username}'
        async_to_sync(self.channel_layer.group_send)(
            group_name, {
                "type": "chat_message",
                "userType": 0, 
                "data": message, 
                'chatId': chat.id,
                'name': self.sender.get_full_name(),
                'userName': self.sender.username
            }
        )

    if message_type == 'providerToStore':
        receiver = text_data_json["receiver"]
        receiver = Store.objects.get(user__username=receiver)
        provider = Provider.objects.get(user__username=self.sender)
        chat = ChatsSP.objects.get(store=receiver, provider=provider)
        MessageSP.objects.create(text=message, date=datetime.datetime.now(), user_type=1, chat=chat)
        group_name = f'chat_{receiver.user.username}'
        async_to_sync(self.channel_layer.group_send)(
            group_name, {
                "type": "chat_message",
                "userType": 0, 
                "data": message, 
                'chatId': chat.id,
                'name': provider.user.get_full_name(),
                'userName': provider.user.username
            }
        )

def chat_message(self, event):
    message = event["data"]
    name = event["name"]
    userName = event["userName"]
    chatId = event["chatId"]
    self.send(text_data=json.dumps({"message": message, 'name': name, 'userName': userName,
                                    'chatId': chatId
                                    }))

关键修改点

  1. 给每个group_send的消息字典添加"type": "chat_message",指定要调用的消费者方法。
  2. 补充name和userName字段,确保chat_message方法能正确读取,避免后续 KeyError。

内容的提问来源于stack exchange,提问作者jabar majidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:50:57