Python实现多人在线匿名聊天的小程序

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

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

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

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

移动端聊天效果图:


移动端聊天.PNG

网页版聊天效果图:


网页版聊天.png

实现思路:

  • 发送的消息通过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

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

目录
相关文章
|
11月前
|
人工智能 Linux 开发工具
Python从零到一:手把手带你写出第一个实用程序
Python语法简洁易懂,适合编程新手入门。它广泛应用于人工智能、自动化办公、Web开发等领域。学习Python可快速搭建项目,拥有丰富库支持和强大社区资源。通过本教程,你将掌握基础语法、环境搭建、程序逻辑控制及实战项目开发,开启编程之旅。
1390 0
|
10月前
|
设计模式 决策智能 Python
Python条件控制:让程序学会"思考"的魔法
本文深入浅出地讲解Python条件控制,从基础if语句到多分支、嵌套结构,再到简洁的三元表达式与Python 3.10新增的match-case模式匹配,结合电商折扣、会员等级、ATM系统等实战案例,全面掌握程序“智能决策”的核心逻辑。
618 0
|
10月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
人工智能 并行计算 开发者
CUDA重大更新:原生Python可直接编写高性能GPU程序
NVIDIA在2025年GTC大会上宣布CUDA并行计算平台正式支持原生Python编程,消除了Python开发者进入GPU加速领域的技术壁垒。这一突破通过重新设计CUDA开发模型,引入CUDA Core、cuPyNumeric、NVMath Python等核心组件,实现了Python与GPU加速的深度集成。开发者可直接用Python语法进行高性能并行计算,显著降低门槛,扩展CUDA生态,推动人工智能、科学计算等领域创新。此更新标志着CUDA向更包容的语言生态系统转型,未来还将支持Rust、Julia等语言。
904 3
CUDA重大更新:原生Python可直接编写高性能GPU程序
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
1349 86
|
存储 移动开发 小程序
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
基于开源技术栈构建的校园圈子系统小程序,整合社交与生活服务功能,涵盖兴趣圈子、私信聊天、资料共享、二手交易、兼职跑腿等六大核心模块。通过多端账号同步(微信公众号/小程序/H5),实现数据实时交互,满足学生群体的多元化需求。项目精准锚定校园市场,以“社交+服务”双轮驱动,提供一站式解决方案,支持快速部署与多校区运营,同时具备广告、佣金、会员等多元变现能力,是打造校园生态的理想工具。
1605 3
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
|
机器学习/深度学习 前端开发 API
python3如何使用QT编写基础的对话框程序
Qt与Python结合形成了PyQt/PySide,为桌面应用开发提供强大支持。通过简单安装PyQt5或PySide6,开发者可快速搭建跨平台GUI应用。本文从创建基础对话框入手,介绍布局管理、信号与槽机制、对话框模式及样式表美化等核心功能,并探讨模态窗口、事件驱动编程和资源打包等内容。最后,引导读者探索模型视图架构、多线程处理等进阶技术,逐步掌握用Python+Qt开发高效桌面应用的技能。
440 0
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
283 4

推荐镜像

更多