最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django實(shí)現(xiàn)WebSocket在線聊天室功能(channels庫(kù))

 更新時(shí)間:2021年09月25日 08:15:39   作者:IT小學(xué)生蔡坨坨  
本文基于channels庫(kù)Django實(shí)現(xiàn)WebSocket在線聊天室功能,包括安裝及創(chuàng)建django項(xiàng)目的全過程,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.Django實(shí)現(xiàn)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 創(chuàng)建Django項(xiàng)目

1.3 http路由

url(r"^chat/$", chat_view.chat, name="chat"),  # 聊天室

1.4 http視圖函數(shù)

def chat(request):
    return render(request, "chat.html")

1.5 settings添加channels相關(guān)配置

INSTALLED_APPS = [
    'channels',  # 項(xiàng)目中要使用channels做WebSocket了
]

ASGI_APPLICATION = "saas.routing.application" # 項(xiàng)目名.routing.application

1.6 創(chuàng)建routing.py(websocket的路由)和comsumers.py(websocket的視圖函數(shù))

1.7 websocket路由

# -*- coding:utf-8 -*-
# 作者:IT小學(xué)生蔡坨坨
# 時(shí)間:2021/4/23 18:21
# 功能:channels相關(guān)路由

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視圖函數(shù)

# -*- coding:utf-8 -*-
# 作者:IT小學(xué)生蔡坨坨
# 時(shí)間:2021/4/23 18:25
# 功能:channels相關(guān)視圖

from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer

# 定義一個(gè)列表,用于存放當(dāng)前在線的用戶
CONSUMER_OBJECT_LIST = []


class ChatConsumer(WebsocketConsumer):

    def websocket_connect(self, message):
        """
        客戶端瀏覽器發(fā)來(lái)連接請(qǐng)求之后就會(huì)被觸發(fā)
        :param message:
        :return:
        """

        # 服務(wù)端接收連接,向客戶端瀏覽器發(fā)送一個(gè)加密字符串
        self.accept()
        # 連接成功
        CONSUMER_OBJECT_LIST.append(self)

    def websocket_receive(self, message):
        """
        客戶端瀏覽器向服務(wù)端發(fā)送消息,此方法自動(dòng)觸發(fā)
        :param message:
        :return:
        """

        print("接受到消息了。", message)

        # 服務(wù)端給客戶端回一條消息
        # self.send(text_data=message["text"])
        for obj in CONSUMER_OBJECT_LIST:
            obj.send(text_data=message["text"])

    def websocket_disconnect(self, message):
        """
        客戶端瀏覽器主動(dòng)斷開連接
        :param message:
        :return:
        """

        # 服務(wù)端斷開連接
        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內(nèi)容 -->
<div style="width: 600px;height: 574px;margin: auto;margin-top: 20px;">
    <div class="panel panel-success">
        <div class="panel-heading">在線實(shí)時(shí)聊天室</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="請(qǐng)輸入消息內(nèi)容......" 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();">發(fā)送</button>
            </div>
        </div>
    </div>
</div>

<!-- 消息模板 -->
<div id="recordTemplate" class="hide">
    <div class="right-info">
        <!-- 用戶 -->
        <p>匿名用戶:</p>

        <!-- 消息內(nèi)容 -->
        <pre>

            </pre>
    </div>
</div>


<!-- js代碼 -->
<script>
    var STATUS; // 是否連接的標(biāo)志
    var ws = new WebSocket("ws://127.0.0.1:8000/chat/");

    ws.onopen = function () {
        // 客戶端在握手環(huán)節(jié)驗(yàn)證成功之后,自動(dòng)執(zhí)行此方法
        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: "當(dāng)前已斷開連接,刷新頁(yè)面重新連接。"
            });
        } else {
            ws.send($("#txt").val());
            $("#txt").val("");
        }
    }

    function closeLink() {
        ws.close();
        STATUS = false;
        console.log("斷開連接");
        swal({
            text: "成功斷開連接,刷新頁(yè)面重新連接。"
        });
    }
</script>

2.效果展示

3.總結(jié)

http協(xié)議
 chat路由 --> chat視圖函數(shù)
 訪問:瀏覽器發(fā)送請(qǐng)求即可
websocket協(xié)議
 chat路由 --> ChatConsumer(3個(gè)方法)
 訪問:new WebSocket對(duì)象

到此這篇關(guān)于Django實(shí)現(xiàn)WebSocket在線聊天室(channels庫(kù))的文章就介紹到這了,更多相關(guān)Django實(shí)現(xiàn)WebSocket在線聊天室內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pandas設(shè)置DataFrame的index索引起始值為1的兩種方法

    Pandas設(shè)置DataFrame的index索引起始值為1的兩種方法

    DataFrame中的index索引列默認(rèn)是從0開始的,那么我們?nèi)绾卧O(shè)置index索引列起始值從1開始呢,本文主要介紹了Pandas設(shè)置DataFrame的index索引起始值為1的兩種方法,感興趣的可以了解一下
    2024-07-07
  • Python sys模塊中maxsize()方法教程示例

    Python sys模塊中maxsize()方法教程示例

    這篇文章主要為大家介紹了Python sys模塊中maxsize()方法教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 解決IDEA 的 plugins 搜不到任何的插件問題

    解決IDEA 的 plugins 搜不到任何的插件問題

    這篇文章主要介紹了解決IDEA 的 plugins 搜不到任何的插件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-05-05
  • python安裝包出現(xiàn)Retrying?(Retry(total=4,?connect=None,?read=None,?redirect=None,?status=None))問題解決

    python安裝包出現(xiàn)Retrying?(Retry(total=4,?connect=None,?read=No

    這篇文章主要給大家介紹了關(guān)于python安裝包出現(xiàn)Retrying?(Retry(total=4,?connect=None,?read=None,?redirect=None,?status=None))問題的解決方法,需要的朋友可以參考下
    2022-09-09
  • 詳解SQLAlchemy框架使用手冊(cè)

    詳解SQLAlchemy框架使用手冊(cè)

    SQLAlchemy是一個(gè)靈活且功能強(qiáng)大的ORM框架,它可以讓Python開發(fā)者輕松地管理數(shù)據(jù)庫(kù),本文主要介紹了SQLAlchemy框架使用手冊(cè),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • tkinter高級(jí)布局之PanedWindow和notebook詳解

    tkinter高級(jí)布局之PanedWindow和notebook詳解

    本文主要介紹了tkinter中的兩種布局控件,分別是可以動(dòng)態(tài)劃分子控件的PanedWindow,和提供了選項(xiàng)卡工具的notebook,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • Python入門教程之Python的安裝下載配置

    Python入門教程之Python的安裝下載配置

    這篇文章主要介紹了Python入門教程之Python的安裝下載配置,Python是一門非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • Python中的xlrd模塊使用整理

    Python中的xlrd模塊使用整理

    今天給大家?guī)?lái)的文章是關(guān)于Python的相關(guān)知識(shí),文章圍繞著xlrd模塊的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python導(dǎo)入時(shí)小括號(hào)大作用

    python導(dǎo)入時(shí)小括號(hào)大作用

    這篇文章主要介紹了python導(dǎo)入時(shí)小括號(hào)的大作用,非常的簡(jiǎn)單實(shí)用,希望這個(gè)小技巧能夠幫到大家
    2017-01-01
  • Python虛擬環(huán)境virtualenv創(chuàng)建及使用過程圖解

    Python虛擬環(huán)境virtualenv創(chuàng)建及使用過程圖解

    這篇文章主要介紹了Python虛擬環(huán)境virtualenv創(chuàng)建及使用過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

东明县| 泾阳县| 西乌珠穆沁旗| 武义县| 栾川县| 曲麻莱县| 平定县| 铜山县| 崇左市| 江川县| 弥渡县| 固原市| 中江县| 鄄城县| 大名县| 榆树市| 浦江县| 高清| 秭归县| 临安市| 多伦县| 涟源市| 灌阳县| 个旧市| 荥经县| 嘉峪关市| 晋城| 南木林县| 双城市| 娄底市| 满洲里市| 焉耆| 内丘县| 若羌县| 赤壁市| 湛江市| 南汇区| 和田县| 巴彦淖尔市| 左权县| 于都县|