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表示矩阵的方法分析
May 26 Python
Python机器学习之SVM支持向量机
Dec 27 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
解决GD中文乱码问题
2007/02/14 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
在Python中移动目录结构的方法
2016/01/31 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
Python调用C++程序的方法详解
2017/01/24 Python
Python可变参数用法实例分析
2017/04/02 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
留学自荐信的技巧
2013/10/17 职场文书
客服实习的个人自我鉴定
2013/10/20 职场文书
音乐教学案例
2014/01/30 职场文书
借款协议书范本
2014/04/22 职场文书
活动总结报告范文
2014/05/04 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
环保证明
2015/06/23 职场文书
运动会加油稿
2015/07/22 职场文书
物资采购管理制度
2015/08/06 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python