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 = "<div style='padding:18px' class ='row'>"+
                                           "<span>"+current_contact_name_hpy+"</span>"+
                                           "<span>"+msg_hpy.date+"</span>"+
                                           "<p>"+msg_hpy.msg +"</p>"+ "</div>";
                           //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 = "<div class='padding:1px' class='row'>"+
                                           "<span>"+msg_sender_name+"</span>"+
                                           "<span>"+msg_hpy.date+"</span>"+
                                           "<p>"+msg_hpy.msg +"</p>"+
                                           "</div>";

                            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!"))

如果没有在和给你发消息的那个人的页面就展示消息数,效果如下:


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值