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初学者的一些编程技巧
Apr 03 Python
Python从MP3文件获取id3的方法
Jun 15 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
Python实现的单向循环链表功能示例
Nov 10 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
解析Python3中的Import
Oct 13 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
javascript模块化简单解析
2016/04/07 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
利用python实现AR教程
2019/11/20 Python
详解Django中异步任务之django-celery
2020/11/05 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
探矿工程师自荐信
2014/01/24 职场文书
小学毕业演讲稿
2014/04/25 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
婚前保证书范文
2015/02/28 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
纯html+css实现Element loading效果
2021/08/02 HTML / CSS
用Python实现屏幕截图详解
2022/01/22 Python