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 break语句详解
Mar 11 Python
跟老齐学Python之开始真正编程
Sep 12 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
wxpython布局的实现方法
Nov 01 Python
Python调用.NET库的方法步骤
Dec 27 Python
python实现的分层随机抽样案例
Feb 25 Python
django admin后管定制-显示字段的实例
Mar 11 Python
python 负数取模运算实例
Jun 03 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
js特殊字符过滤的示例代码
2014/03/05 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
Javascript之String对象详解
2016/06/08 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
python正则表达式match和search用法实例
2015/03/26 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python3 合并二叉树的实现
2019/09/30 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
python 实现汉诺塔游戏
2020/11/28 Python
实习医生自我评价
2013/09/22 职场文书
项目施工员岗位职责
2014/03/09 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
2015年采购部工作总结
2015/04/23 职场文书
JavaScript获取URL参数的方法分享
2022/04/07 Javascript