最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于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