Django Channels对接WebSocket时接收数据模型字段缺失问题求助
问题修复方案
- 首先修复重复JSON序列化问题:你在
views.py中提前对data、sender、receiver、created四个字段做了json.dumps()序列化转字符串,后续在consumer.py中又对整个返回字典做了一次全局序列化,双重序列化会导致字段被转义,容易出现解析异常、字段看似缺失的问题。 - 其次加字段容错逻辑:原代码直接用
event['key']的方式取值,如果某字段发送时缺失会直接抛出KeyError,导致后续代码不执行、无返回结果。 - 最后提前校验数据源:在发送事件到Channels层之前打印相关字段值,确认Serializer输出、关联查询结果本身没有缺失。
修改后的views.py代码
async_to_sync(layer.group_send)(("chat_" + str(channel_name)), { 'type': 'chat_message', 'method': 'POST', 'model': 'social', 'data': serializers.data, 'description': 'new post', 'sender': LikeSerializer(request.user, many=False).data, 'receiver': sorted(my_profile.profile_followers.all().values_list('id', flat=True)), 'created': timezone.now().isoformat(), 'seen': None })
修改后的consumer.py代码
# Receive message from room group async def chat_message(self, event): method = event.get('method') model = event.get('model') data = event.get('data') description = event.get('description') receiver = event.get('receiver') sender = event.get('sender') created = event.get('created') seen = event.get('seen') # Send message to WebSocket await self.send(text_data=json.dumps({ 'method': method, 'model': model, 'data': data, 'description': description, 'receiver': receiver, 'sender': sender, 'created': created, 'seen': seen, }))
如果修复后仍有字段缺失,检查Postman是否以JSON格式解析返回结果,排除文本解析导致的字段展示异常。
内容的提问来源于stack exchange,提问作者Zaid Kallel
相关产品推荐
相关产品推荐

