后台处理获取到前端发来的消息并且转发到收消息的队列
(也就是后台把消息发到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(五)】
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)