最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码.

在线聊天地址(无需登录,开一个窗口,代表一个用户):

http://zhaozhaoli.vicp.io/chatroom/happy/

移动端聊天效果图:

移动端聊天.PNG

网页版聊天效果图:

网页版聊天.png

实现思路:

发送的消息通过ajax先写入数据库,通过ajax的循环请求,将写入数据库的消息显示到前端界面.

前端核心代码:

$(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());

}

})

})

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 = "

"+content[i].user_name+"

";

html = html + "

"+content[i].mess+"

";

$("#content").append(html);

}else{

var html = "

"+content[i].user_name+"

";

html = html + "

"+content[i].mess+"

";

$("#content").append(html);

}

$("#show_info").scrollTop($("#content").height())

}

}

})

}

update_info();

setInterval(update_info, 1000);

})

$(function () {

//监听键盘点击

$(document).keyup(function (event) {

if (event.keyCode == 13){

$("#send").click();

}

})

})

$(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("")

}

})

})

我的昵称:{{user_name}}更名
消息

发送消息

{{user_id}}
{{user_ip}}

{{csrf_token}}

后端核心代码:

# 返回基础页面

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

教程涉及到的资源我都通过百度网盘分享给大家,为了便于大家的下载,资源整合到了一张独立的帖子里,链接如下:

http://www.jianshu.com/p/4f28e1ae08b1

python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序-阿里云开发者社区...相关推荐

  1. python部署到服务器上解析不到模块_python socket模块放到服务器上就跑不了了 -问答-阿里云开发者社区-阿里云...

    话不多说直接放代码: 先说一下,下面出现的101.133.229.251是我服务器IP 客户端: import socket s = socket.socket(socket.AF_INET,sock ...

  2. python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区

    Python 执行 shell 命令 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令 ...

  3. python网络爬虫从入门到实践(第2版)_带你读《Python网络爬虫从入门到实践(第2版)》之三:静态网页抓取-阿里云开发者社区...

    第3章 静态网页抓取 在网站设计中,纯粹HTML格式的网页通常被称为静态网页,早期的网站一般都是由静态网页制作的.在网络爬虫中,静态网页的数据比较容易获取,因为所有数据都呈现在网页的 HTML代码中. ...

  4. python与材料计算公式_《从问题到程序:用Python学编程和计算》——2.11 补充材料-阿里云开发者社区...

    本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2 ...

  5. python 项目学编程_《从问题到程序:用Python学编程和计算》——3.5 练习-阿里云开发者社区...

    复习下面概念:数值积分,区间分割法,舍入误差,简单重复,累积,累积变量,生成和筛选,递推,递推变量,素数(质数),因子和真因子,哥德巴赫猜想,输入循环,输入控制的循环,递归定义,递归函数,循环定义,无 ...

  6. python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...

    本节书摘来自华章计算机<Python程序设计>一书中的第1章,第1.1节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区"华 ...

  7. python中引入sql的优点_引用sql-和引用sql相关的内容-阿里云开发者社区

    bboss持久层改进支持模块sql配置文件引用其它模块sql配置文件中sql语句 bboss持久层改进支持模块sql配置文件引用其它模块sql配置文件中sql语句. 具体使用方法如下: <pro ...

  8. python的requests模块功能_《Python数据可视化编程实战》—— 1.7 安装requests模块-阿里云开发者社区...

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第1章,第1.7节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  9. python高手之路第三版_《Python高手之路(第3版)》——1.3 版本编号-阿里云开发者社区...

    本节书摘来自异步社区<Python高手之路(第3版)>一书中的第1章,第1.3节,作者[法]Julien Danjou,王飞龙 译,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. 洛谷P2286 [HNOI2004]宠物收养所 [STL,平衡树]
  2. 30个流行的jQuery Plugins
  3. 01背包模板、全然背包 and 多重背包(模板)
  4. 十条nmap常用的扫描命令
  5. Gradle 依赖项管理
  6. Java集合框架:WeakHashMap
  7. UIScrollViewDelegate-代理API详解
  8. 如何使用Docker、Docker-Compose和Rancher搭建部署Pipeline(二)
  9. 福建副省长:加快推进区块链应用场景,积极打造数字应用第一省
  10. 思岚科技受邀2018高交会 携多项“黑科技”亮相
  11. 为什么一个实例只有一个LGWR
  12. PIC24 通过USB在线升级 -- USB HID bootloader
  13. Ajax无刷新数据绑定
  14. 对接亚马逊 SP-API(Amazon Selling Partner API) 第五章:Reports 模块
  15. 用coding向你最爱的人说圣诞快乐
  16. 人工智能的发展方向与机遇
  17. 【Tornado】| 扫码签到系统雏形及思路
  18. 内存泄漏导致的浏览器崩溃
  19. asp毕业设计——基于asp+access的学生成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统
  20. php版本kms,使用 AWS KMS 加密和解密 AWS SDK for PHP 数据密钥 - 适用于 PHP 的 AWS 开发工具包...

热门文章

  1. RocketMQ面试题及答案
  2. 开源能翻译英文的Android阅读器
  3. nacos配置中心遇到的问题
  4. 台式电脑的拆装、清灰
  5. 2020年下半年系统集成项目管理工程师上午真题及答案解析
  6. python 之 *args 和 **kwargs的区别
  7. springboot微信sdk方式进行微信支付
  8. 全网最全简历大全!全免费!
  9. 多人开源博客系统 - 再搜集
  10. Arduino PAJ7620手势识别传感器 实验