python 开发模拟板Web QQ(五)

后台处理获取到前端发来的消息并且转发到收消息的队列
(也就是后台把消息发到2的对列里面)
前端post过来的数据由于是js字典,后端无法识别,所以把字典转成json格式发送到后台,后台反序列化提取。
后台处理转到前台的实现:
先定义一个全局的字典,当开始启动web server时,queue应该为空,所以字典为空。
每次消息过来时就,就判断queue是否存在,不存在就建立一个queue。
每次请求不一定就是取消息,有可能是查找联系人,添加朋友。所以最好用类来实现请求。
用views.py 的send_msg方法实现后台去获取前端发来的数据,并把数据放到接受者的对列里面

def send_msg(request):print(request.POST)data = https://www.it610.com/article/request.POST.get('data') data = https://www.it610.com/article/json.loads(data) data['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") to_id = data.get('to_id') user_obj = models.hpy_models.UserProfilehpy.objects.get(id=to_id) contact_type = data.get('contact_type') #把消息发到对应的queue里面 #用用户id判断queue存不存在不存在就建立一个queue #可能请求很多 #写个类来判断实现请求 if contact_type == 'single': ifnotto_id in global_msg_dic: #每次请不一定就是取消息,有可能是查找联系人。所以用一个类来实现请求。这里用的是Chat()类 global_msg_dic[to_id] = utils.Chat() #有消息直接向对咧put global_msg_dic[to_id].msg_queue_hpy.put(data) print('\033[31; 1mPush msg [%s] into user [%s] queue' % (data['msg'],user_obj.name)) elif contact_type == 'group': group_obj_hpy = models.QQGrouphpy.objects.get(id=to_id) for member in group_obj_hpy.members.select_related(): #群发不给自己发 if member.id != request.user.userprofilehpy.id: ifnotmember.id in global_msg_dic: global_msg_dic[member.id] = utils.Chat() global_msg_dic[to_id].msg_queue_hpy.put(data) return HttpResponse("aaaaaaaaa")





前端到后端获取新的消息并展示到前端窗口展示
(2向后台不断请求看是否有新消息)
前端用ajax向后端获取新消息,判断当前页面是否打开,如果页面打开就直接把新消息加载到页面展示,如果页面没有打开就缓存消息,计算发送的总消息数传递到页面。

//ajax 用get去后台取消息。取回来的是json,反序列化 function GetNewMsg_hpy(){var current_contact_id_hpy = $(".dialog-box-head span").attr("contact-id"); var current_contact_name_hpy = $(".dialog-box-head span").text(); $.get("{% url 'get_new_msg'%}",{'uid':"{{ request.user.userprofilehpy.id }}"},function(callback_hpy){ console.log(callback_hpy); callback_hpy =JSON.parse(callback_hpy); $.each(callback_hpy,function(index,msg_hpy){ if(msg_hpy.from_id == current_contact_id_hpy){ //判断消息是否属于当前聊天的窗口 var msg_div = ""+ ""+current_contact_name_hpy+""+ ""+msg_hpy.date+""+ ""+msg_hpy.msg +"
"+ ""; //console.log("hello"+msg_div); $(".dialog-box-content").append(msg_div); } //设置没有读取的消息数else{ //发送这条消息的人,当前它的对话框没被打开。所以只能更新消息数 var msg_count_ele = $("#contact-list a[contact-id='"+msg_hpy.from_id +"'] span"); msg_count_ele.text(parseInt(msg_count_ele.text()) + 1); msg_count_ele.removeClass("hide"); //把消息存起来保存在临时变量中 var msg_sender_name = $("#contact-list a[contact-id='"+msg_hpy.from_id +"']").text(); var msg_div = ""+ ""+msg_sender_name+""+ ""+msg_hpy.date+""+ ""+msg_hpy.msg +"
"+ ""; var old_session_content = Session_hpy(msg_hpy.from_id,msg_hpy.contact_type,'load'); var new_session_content = old_session_content+msg_div; all_dialog_sessions[msg_hpy.contact_type][msg_hpy.from_id] = new_session_content; } //get本身不堵塞 //console.log(msg_hpy.from_id); }); //end each GetNewMsg_hpy(); }); //end get // GetNewMsg_hpy(); console.log('----no block------') }


在view.py 用 get_msg 方法去后台获取
def get_msg(request): uid = request.GET.get('uid') if uid: #判断是否有消息 res = [] if uid not in global_msg_dic: global_msg_dic[uid] = utils.Chat() #调用类下面的get_msg方法 res = global_msg_dic[uid].get_msg(request) return HttpResponse(json.dumps(res)) else: return HttpResponse(json.dumps("uid not provided!"))


如果没有在和给你发消息的那个人的页面就展示消息数,效果如下:
python 开发模拟板Web QQ(五)
文章图片


【python 开发模拟板Web QQ(五)】

    推荐阅读