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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
浅谈python可视化包Bokeh
Feb 07 Python
Python3.6连接Oracle数据库的方法详解
May 18 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
浅谈Python中eval的强大与危害
Mar 13 Python
python调用自定义函数的实例操作
Jun 26 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python中turtle库的使用实例
Sep 09 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
pyCharm 实现关闭代码检查
Jun 09 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
You might like
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
Python随机数random模块使用指南
2016/09/09 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
年度考核自我鉴定
2014/03/19 职场文书
食品流通安全承诺书
2014/05/22 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby