中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django如何實現WebSocket在線聊天室功能

發布時間:2021-09-26 09:49:53 來源:億速云 閱讀:203 作者:小新 欄目:開發技術

這篇文章主要介紹Django如何實現WebSocket在線聊天室功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

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在線聊天室功能Django如何實現WebSocket在線聊天室功能

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 >
    <div class="panel panel-success">
        <div class="panel-heading">在線實時聊天室</div>
        <div class="panel-body">
            <div >
                <div id="content">
                    <!-- 聊天記錄 -->
                </div>
            </div>
            <div >
                <textarea type="text" id="txt" placeholder="請輸入消息內容......" class="form-control"></textarea>
            </div>
        </div>

        <div class="table">
            <div>
                <button class="btn btn-danger" onclick="closeLink();" >斷開連接</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在線聊天室功能

3.總結

http協議
 chat路由 --> chat視圖函數
 訪問:瀏覽器發送請求即可
websocket協議
 chat路由 --> ChatConsumer(3個方法)
 訪問:new WebSocket對象

以上是“Django如何實現WebSocket在線聊天室功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平阳县| 从化市| 和田县| 徐汇区| 文成县| 柯坪县| 晋宁县| 黎平县| 香河县| 南宫市| 大厂| 临澧县| 乐昌市| 平度市| 门源| 祥云县| 正镶白旗| 拉萨市| 沭阳县| 冕宁县| 乌兰察布市| 贵南县| 清苑县| 葫芦岛市| 湖口县| 泾源县| 岑巩县| 长武县| 加查县| 南阳市| 南通市| 浑源县| 墨脱县| 广安市| 汶上县| 石台县| 长治县| 若尔盖县| 色达县| 绥中县| 双流县|