最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码.
在线聊天地址(无需登录,开一个窗口,代表一个用户):
http://zhaozhaoli.vicp.io/chatroom/happy/
移动端聊天效果图:
网页版聊天效果图:
实现思路:
发送的消息通过ajax先写入数据库,通过ajax的循环请求,将写入数据库的消息显示到前端界面.
前端核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<script> $(function () { $( "#send" ).click(function () { var input_info = $( "#input_info" ).val(); if (input_info.length < 1 ) { alert( "请输入字符后发送" ); return ; } else if (input_info.length > 200 ) { alert( "每次发送不可以超出200个字符哈~" ); return ; } else { / / 获取csrftoken的值 var csrf_value = $( '#csrfmiddlewaretoken' ).text(); var user_id = $( "#user_id" ).text(); var user_name = $( "#user_name" ).text(); $.ajax({ 'url' : '/chatroom/save_chat_log/' , 'data' : { 'chat_content' : input_info, 'user_id' : user_id, 'user_name' : user_name, 'user_ip' : '127.127.127.127' , 'csrfmiddlewaretoken' : csrf_value }, 'type' : 'post' , 'async' : false, 'success' : function (data) { } }); $( "#input_info" ).val(""); console.log($( "#show_info" ).scrollTop()); } }) }) < / script> <script> var user_id = $( "#user_id" ).text(); var user_name = $( "#user_name" ).text(); $(function () { var last_id = 0 ; var csrf_value2 = $( '#csrfmiddlewaretoken' ).text(); function update_info() { / / ajax 获取最新数据 $.ajax({ 'url' : '/chatroom/get_near_log/' , 'data' :{ "last_id" :last_id, 'csrfmiddlewaretoken' : csrf_value2}, 'type' : 'post' , 'async' : false, 'success' :function (data) { if (parseInt(last_id) = = parseInt(JSON.parse(data.data).last_id)){ return ; } / / 获取后台传过来的 id 值,并将值存储到全局变量中 last_id = JSON.parse(data.data).last_id; / / 将内容读取,并打印 content = JSON.parse(data.data).info; for (var i = 0 ; i< content.length; i + + ){ if (parseInt(content[i].user_id) = = parseInt($( "#user_id" ).text())){ var html = "<div class='my_info'><span>" + content[i].user_name + "</span></div>" ; html = html + "<div class='my_one_info'>" + content[i].mess + "</div>" ; $( "#content" ).append(html); } else { var html = "<div class='other_info'><span>" + content[i].user_name + "</span></div>" ; html = html + "<div class='other_one_info'>" + content[i].mess + "</div>" ; $( "#content" ).append(html); } $( "#show_info" ).scrollTop($( "#content" ).height()) } } }) } update_info(); setInterval(update_info, 1000 ); }) < / script> <script> $(function () { / / 监听键盘点击 $(document).keyup(function (event) { if (event.keyCode = = 13 ){ $( "#send" ).click(); } }) }) < / script> <script> $(function () { $( "#change_name" ).click(function () { / / 获取新名称 var new_name = String($( "#new_name" ).val()); / / 检查新名称是否合法 / / 如果合法 if (new_name.length< 11 && new_name.length> 0 ){ console.log(new_name); $( "#user_name" ).text(new_name); $( "#new_name" ).val("") } else { alert( "昵称长度应为1-10,请重新输入" ); $( "#new_name" ).val("") } }) }) < / script> <div id = "main_form" > <div class = "my_nike_name" >我的昵称:<span id = "user_name" >{{user_name}}< / span><span><button id = "change_name" >更名< / button>< input type = "text" id = "new_name" >< / span>< / div> <div id = "show_info" > <div id = "content" > < / div> < / div> <br> <div class = "my_nike_name" >消息< / div> < input type = "text" id = "input_info" > <button id = "send" >发送消息< / button> <div id = "user_id" style = "display: none" >{{user_id}}< / div> <div id = "user_ip" style = "display: none" >{{user_ip}}< / div> <span id = "csrfmiddlewaretoken" style = "display: none" >{{csrf_token}}< / span> < / div> |
后端核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# 返回基础页面 def happy(request): user_info = UserInfo() # 初始用户名为匿名用户 user_name = "匿名用户" user_info.user_name = user_name # 利用时间产生临时ID user_id = int (time.time()) user_info.user_id = user_id # 获取用户ip user_ip = wrappers.get_client_ip(request) user_info.user_ip = user_ip user_info.save() return render(request, 'chatroom/happy.html' , locals ()) # 保存聊天内容 def save_chat_log(request): try : print ( "后端收到了ajax消息" ) chatinfo = ChatInfo() # 获取前端传过来的数据 chat_content = wrappers.post(request, "chat_content" ) user_ip = wrappers.get_client_ip(request) user_name = wrappers.post(request, "user_name" ) user_id = wrappers.post(request, "user_id" ) # 将数据存入数据库 chatinfo.chat_content = chat_content chatinfo.user_ip = user_ip chatinfo.user_name = user_name chatinfo.user_id = user_id chatinfo.save() return JsonResponse({ "ret" : 0 }) except : return JsonResponse({ "ret" : "保存出现问题" }) pass # 获取最近的聊天信息 def get_near_log(request): try : # 获取数据库内所有的信息 all_info = ChatInfo.objects. all () # 获取数据库内最后一条消息的id id_max = ChatInfo.objects.aggregate( Max ( 'id' )) last_id = id_max[ "id__max" ] # print("后台数据库内最新的id为", last_id) # 获取请求的id值 old_last_id = wrappers.post(request, "last_id" ) print (old_last_id, "<-<-" ) print (old_last_id, type (old_last_id), "-->" ) # print("后台发送过来的id为",old_last_id) # 返回的信息字典,返回当前时间(current_date),返回信息列表(id_info) # 如果第一次请求,则回复最后一条消息的id if int (old_last_id) = = 0 : user_ip = wrappers.get_client_ip(request) result_dict = dict () result_dict[ "last_id" ] = last_id result_dict[ "info" ] = [{ "id" : "-->" , "mess" : "欢迎" + user_ip + "来到聊天室!" , "user_name" : "系统消息:" }] result_dict[ "user_id" ] = "" result_dict = json.dumps(result_dict,ensure_ascii = False ) # print("第一次握手") return JsonResponse({ "data" :result_dict}) # 如果数据内没有消息更新 elif int (old_last_id) > = int (last_id): result_dict = dict () result_dict[ "last_id" ] = last_id result_dict[ "info" ] = [{last_id: "欢迎再次来到聊天室!" }] result_dict[ "user_id" ] = "" result_dict = json.dumps(result_dict,ensure_ascii = False ) # print("一次无更新的交互") return JsonResponse({ "data" :result_dict}) # 如果有消息更新 else : # print("有更新的回复") result_dict = dict () # 获取新的消息对象集合 the_new_info = ChatInfo.objects. filter (id__gt = old_last_id) # 创建消息列表 mess_list = list () # 将最新的消息组成字典进行返回 for info in the_new_info: # print(info) # print ("-->",info.chat_content, info.id) # 创建消息字典 mess_dic = dict () mess_dic[ "id" ] = info. id mess_dic[ "mess" ] = info.chat_content # 将消息所属的用户添加到消息列表 mess_dic[ "user_name" ] = info.user_name mess_dic[ "user_id" ] = info.user_id # 将消息字典添加到消息列表 mess_list.append(mess_dic) result_dict[ "last_id" ] = last_id result_dict[ "info" ] = mess_list # result_dict["info"] = [{"id":3, "mess":"hahah"}, {"id":4, "mess":"666"}] result_dict = json.dumps(result_dict,ensure_ascii = False ) # print("--->>>", type(result_dict)) return JsonResponse({ "data" :result_dict}) except : return JsonResponse({ "ret" : "刷新出现问题" }) pass |
总结
以上所述是小编给大家介绍的Python使用django框架实现多人在线匿名聊天的小程序,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.jianshu.com/p/8aa1238bf6d4?utm_source=tuicool&utm_medium=referral