Django实现WebSocket在线聊天室功能(channels库)


Posted in Python onSeptember 25, 2021

1.Django实现WebSocket在线聊天室

1.1 安装

pip install channels==2.3

(saas) F:\Desktop\Python_Study\CHS-Tracer\saas>pip install channels==2.3
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Collecting channels==2.3
  Downloading
  ...
Successfully installed Automat-20.2.0 attrs-20.3.0 autobahn-21.3.1 channels-2.3.0

1.2 创建Django项目

1.3 http路由

url(r"^chat/$", chat_view.chat, name="chat"),  # 聊天室

1.4 http视图函数

def chat(request):
    return render(request, "chat.html")

1.5 settings添加channels相关配置

INSTALLED_APPS = [
    'channels',  # 项目中要使用channels做WebSocket了
]

ASGI_APPLICATION = "saas.routing.application" # 项目名.routing.application

1.6 创建routing.py(websocket的路由)和comsumers.py(websocket的视图函数)

Django实现WebSocket在线聊天室功能(channels库)Django实现WebSocket在线聊天室功能(channels库)

1.7 websocket路由

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2021/4/23 18:21
# 功能:channels相关路由

from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url

from web import consumers

application = ProtocolTypeRouter({
    "websocket": URLRouter([
        url(r'^chat/$', consumers.ChatConsumer),
    ])
})

1.8 websocket视图函数

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2021/4/23 18:25
# 功能:channels相关视图

from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer

# 定义一个列表,用于存放当前在线的用户
CONSUMER_OBJECT_LIST = []


class ChatConsumer(WebsocketConsumer):

    def websocket_connect(self, message):
        """
        客户端浏览器发来连接请求之后就会被触发
        :param message:
        :return:
        """

        # 服务端接收连接,向客户端浏览器发送一个加密字符串
        self.accept()
        # 连接成功
        CONSUMER_OBJECT_LIST.append(self)

    def websocket_receive(self, message):
        """
        客户端浏览器向服务端发送消息,此方法自动触发
        :param message:
        :return:
        """

        print("接受到消息了。", message)

        # 服务端给客户端回一条消息
        # self.send(text_data=message["text"])
        for obj in CONSUMER_OBJECT_LIST:
            obj.send(text_data=message["text"])

    def websocket_disconnect(self, message):
        """
        客户端浏览器主动断开连接
        :param message:
        :return:
        """

        # 服务端断开连接
        CONSUMER_OBJECT_LIST.remove(self)
        raise StopConsumer()

1.9 前端代码

<!-- css样式 -->
<style>
    pre {
        display: block;
        padding: 9.5px;
        margin: 0 0 10px;
        font-size: 18px;
        line-height: 1.42857143;
        color: #333;
        word-break: break-all;
        word-wrap: break-word;
        background-color: #00aaaa;
        border-radius: 12px;
    }
</style>

<!-- body内容 -->
<div style="width: 600px;height: 574px;margin: auto;margin-top: 20px;">
    <div class="panel panel-success">
        <div class="panel-heading">在线实时聊天室</div>
        <div class="panel-body">
            <div style="border: #f5f5f5 2px solid;width: 570px;height: 400px;overflow:scroll">
                <div id="content">
                    <!-- 聊天记录 -->
                </div>
            </div>
            <div style="border-color: white;margin-top: 10px">
                <textarea type="text" id="txt" placeholder="请输入消息内容......" class="form-control"></textarea>
            </div>
        </div>

        <div class="table">
            <div>
                <button class="btn btn-danger" onclick="closeLink();" style="margin-left: 74%">断开连接</button>
                <button class="btn btn-success" onclick="sendMsg();">发送</button>
            </div>
        </div>
    </div>
</div>

<!-- 消息模板 -->
<div id="recordTemplate" class="hide">
    <div class="right-info">
        <!-- 用户 -->
        <p>匿名用户:</p>

        <!-- 消息内容 -->
        <pre>

            </pre>
    </div>
</div>


<!-- js代码 -->
<script>
    var STATUS; // 是否连接的标志
    var ws = new WebSocket("ws://127.0.0.1:8000/chat/");

    ws.onopen = function () {
        // 客户端在握手环节验证成功之后,自动执行此方法
        console.log("连接成功。")
    };

    ws.onmessage = function msg(event) {
        var $item = $("#recordTemplate").find('.right-info').clone();
        $item.find('pre').html(event.data);
        $("#content").append($item);
    };

    function sendMsg() {
        if (STATUS == false) {
            swal({
                title: "已断开",
                text: "当前已断开连接,刷新页面重新连接。"
            });
        } else {
            ws.send($("#txt").val());
            $("#txt").val("");
        }
    }

    function closeLink() {
        ws.close();
        STATUS = false;
        console.log("断开连接");
        swal({
            text: "成功断开连接,刷新页面重新连接。"
        });
    }
</script>

2.效果展示

Django实现WebSocket在线聊天室功能(channels库)

3.总结

http协议
 chat路由 --> chat视图函数
 访问:浏览器发送请求即可
websocket协议
 chat路由 --> ChatConsumer(3个方法)
 访问:new WebSocket对象

到此这篇关于Django实现WebSocket在线聊天室(channels库)的文章就介绍到这了,更多相关Django实现WebSocket在线聊天室内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
神经网络python源码分享
Dec 15 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
python时间序列按频率生成日期的方法
May 14 Python
详解Python 调用C# dll库最简方法
Jun 20 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python画微信表情符的实例代码
Oct 09 Python
python切割图片的示例
Nov 12 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 Python
一文搞懂如何实现Go 超时控制
Mar 30 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
Express.JS使用详解
2014/07/17 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python with语句用法原理详解
2020/07/03 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
物业管理应届生求职信
2013/10/28 职场文书
出纳会计岗位职责
2014/03/12 职场文书
保护环境倡议书范文
2014/05/13 职场文书
英语专业求职信
2014/07/08 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
2014年消防工作总结
2014/11/21 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
高三英语复习计划
2015/01/19 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
进行数据处理的6个 Python 代码块分享
2022/04/06 Python