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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
Python程序中的观察者模式结构编写示例
May 27 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
浅谈django orm 优化
Aug 18 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
详解python中的index函数用法
Aug 06 Python
python图形用户接口实例详解
Dec 16 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Django 删除upload_to文件的步骤
Mar 30 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
简单的三步vuex入门
2018/05/20 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
python使用邻接矩阵构造图代码示例
2017/11/10 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
客房主管岗位职责
2013/12/09 职场文书
特色蛋糕店创业计划书
2014/01/28 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
会计求职简历自我评价
2015/03/10 职场文书
考试没考好检讨书
2015/05/06 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技