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 }))
关键修改点
- 给每个
group_send的消息字典添加"type": "chat_message",指定要调用的消费者方法。 - 补充
name和userName字段,确保chat_message方法能正确读取,避免后续 KeyError。
内容的提问来源于stack exchange,提问作者jabar majidi
相关产品推荐
相关产品推荐

