侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python使用django框架实现多人在线匿名聊天的小程序

Python  /  管理员 发布于 7年前   180

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

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

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

移动端聊天效果图:

网页版聊天效果图:

实现思路:

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

前端核心代码:

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

后端核心代码:

# 返回基础页面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框架实现多人在线匿名聊天的小程序,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    Python中Scrapy爬虫图片处理详解
    下一条:
    Python实现的计数排序算法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客