# -*- coding: utf-8 -*- import urllib from asgiref.sync import sync_to_async from channels.db import database_sync_to_async from channels.generic.websocket import AsyncJsonWebsocketConsumer, AsyncWebsocketConsumer import json from jwt import InvalidSignatureError from application import settings from dvadmin.system.models import MessageCenter send_dict = {} # 发送消息结构体 def message(sender, msg_type, msg): text = { 'sender': sender, 'contentType': msg_type, 'content': msg, } return text #异步获取消息中心的目标用户 @database_sync_to_async def _get_message_center_instance(message_id): _MessageCenter = MessageCenter.objects.filter(id=message_id).values_list('target_user',flat=True) if _MessageCenter: return _MessageCenter else: return [] def request_data(scope): query_string = scope.get('query_string', b'').decode('utf-8') qs = urllib.parse.parse_qs(query_string) return qs class DvadminWebSocket(AsyncJsonWebsocketConsumer): async def connect(self): try: import jwt self.service_uid = self.scope["url_route"]["kwargs"]["service_uid"] params = request_data(self.scope) room = params.get('room')[0] decoded_result = jwt.decode(self.service_uid, settings.SECRET_KEY, algorithms=["HS256"]) if decoded_result: self.user_id = decoded_result.get('user_id') self.chat_group_name = room #收到连接时候处理, await self.channel_layer.group_add( self.chat_group_name, self.channel_name ) # 将该客户端的信息发送函数与客户端的唯一身份标识绑定,保存至自定义的字典中 if len(send_dict)==0: send_dict.setdefault(self.chat_group_name, {}) for room in send_dict.keys(): if room == self.chat_group_name: send_dict[self.chat_group_name][self.user_id] = self.send else: send_dict.setdefault(self.chat_group_name,{}) await self.accept() await self.send_json(message('system', 'INFO', '连接成功')) except InvalidSignatureError: await self.disconnect(None) async def disconnect(self, close_code): # 删除 send_dict 中对应的信息 del send_dict[self.chat_group_name][self.user_id] # Leave room group await self.channel_layer.group_discard(self.chat_group_name, self.channel_name) print("连接关闭") await self.close(close_code) async def receive(self, text_data=None, byte_text_data=None): print(text_data) try: text_data_json = json.loads(text_data) except Exception as e: print('数据无法被json格式化', e) await self.disconnect(400) else: print(123,text_data_json) # 获取将要推送信息的目标身份标识,调用保存在 send_dict中的信息发送函数 message_id = text_data_json.get('message_id', None) user_list = await _get_message_center_instance(message_id) for send_user in user_list: await send_dict[self.chat_group_name][send_user](text_data=json.dumps(text_data_json))