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随机生成彩票号码的方法
Mar 05 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python最小二乘法矩阵
Jan 02 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
python 实用工具状态机transitions
Nov 21 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
Python中如何处理常见报错
Jan 18 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
js实现简单的验证码
2015/12/25 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
基于Python实现用户管理系统
2019/02/26 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Python面向对象封装操作案例详解
2019/12/31 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
餐饮总经理岗位职责
2014/03/07 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
见习报告的格式
2014/11/04 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
考研经验交流会策划书
2015/11/02 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript