python 开发模拟板Web QQ(五)

后台处理获取到前端发来的消息并且转发到收消息的队列

(也就是后台把消息发到2的对列里面)

前端post过来的数据由于是js字典,后端无法识别,所以把字典转成json格式发送到后台,后台反序列化提取。

后台处理转到前台的实现:

先定义一个全局的字典,当开始启动web server时,queue应该为空,所以字典为空。

每次消息过来时就,就判断queue是否存在,不存在就建立一个queue

每次请求不一定就是取消息,有可能是查找联系人,添加朋友。所以最好用类来实现请求。

views.py send_msg方法实现后台去获取前端发来的数据,并把数据放到接受者的对列里面

def send_msg(request):

    print(request.POST)

    data = request.POST.get('data')
    data = 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':
         if  not  to_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:
               if  not  member.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(五)_第1张图片

 

你可能感兴趣的:(python)