新余论谈:Django使用channel实现websocket

admin 2周前 (05-16) 科技 10 0

channel

什么是channel?

channel是第三方工具包,对于不支持websocket协议的框架可以借助此包实现websocket

安装

终端安装:

 pip3 install channel  

pycharm安装:

Project Interprete 搜索  “channel”即可

设置

1、设置 setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'channels',
]

设置完app后,还要对ASGI_APPLICATION设置:

# 设置 channel
ASGI_APPLICATION = "MiniChat.routing.application"

若是不设置就会报错:

CommandError: You have not set ASGI_APPLICATION, which is needed to run the server.

2.、设置路由

在app下新建routing.py文件,此文件相当于django的url.py

MiniChat/routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url
from chat import consumers

application = ProtocolTypeRouter({
    "websocket":URLRouter([

    ])
})

3、建立营业处置文件:consumers.py 

此文件相当于django中的view.py文件

MiniChat/consumers.py

#!usr/bin/env python
#-*- coding:utf-8 _*-
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StoPConsumer

class ChatConsumer(WebsocketConsumer):

    def websocket_connect(self, message):
        """
        客户端发送请求进来,触发此方式
        :param message:
        :return:
        """
        self.accept()

    def websocket_receive(self, message):
        """
        客户端发送新闻,触发此方式,并返回数据
        :param message:
        :return:
        """
        self.send()

    def websocket_disconnect(self, message):

        """
        客户端自动断开链接,触发此方式
        :param message:
        :return:
        """
        # 服务端触发异常 StopConsumer
        raise StopConsumer



 
consumers.py

最终项目目录:

 案例:WebChat

基于上面的设置,先建立一个视图:

from django.shortcuts import render

# Create your views here.

def index(request):

    return render(request, "index.html")

然后在app01中建立一个templates包,在这个包中建立一个index.html.再去实现html文件:

Django默认模板查找顺序是从根目录查找,找不到再去app中查找

<div>
    <div>
        <input type="text" id="txt">
        <input type="button" value="send" onclick="sendMsg();">
        <input type="button" value="close" onclick="closeConn();">
    </div>
    <h2>谈天记录</h2>
    <div id="content">

    </div>
</div>

现在跑一下项目文件,浏览器页面显示:

 

 现在再去完善下html文件

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script>
<script>

    var ws = new WebSocket("ws://127.0.0.1:8000/chat/");

    ws.onopen = function(){
        // 客户端验证握手环节完成之后,自动执行该方式
        console.log("链接乐成。。。")
    };

    ws.onmessage = function (event) {
        //  接受服务端发送的新闻
        //  客户端完成握手验证之后 触发该方式
        console.log(event.data);
        var tag = $("<div>");
        tag.text(event.data);
        $("#content").append(tag);
        console.log(1)

    };

    function sendMsg() {
        // ws.send():发送新闻
      ws.send($("#txt").val());

    };

    function closeConn() {
        // ws.close():关闭Websocket链接
        console.log("断开链接。。。");
        ws.close();
    };

</script>

在这里就使用简朴的方式实现多人谈天的功效,对consumers.py做以下修改:

USER_list = []
class ChatConsumer(WebsocketConsumer):

    def websocket_connect(self, message):
        """
        客户端发送请求进来,触发此方式
        :param message:
        :return:
        """
        self.accept()  # 执行accept之后代表链接乐成
        USER_list.append(self)  # 将每一个链接的用户添加到列表中

    def websocket_receive(self, message):
        """
        客户端发送新闻,触发此方式,并返回数据
        :param message:
        :return:
        """
        # print("msg:", message)      # msg: {'type': 'websocket.receive', 'text': '123'}
        data = message["text"]        # 获取字典中的数据
        # self.send("over")
        for user in USER_list:   # 遍历用户列表返回新闻
            user.send(data)

    def websocket_disconnect(self, message):
        """
        客户端自动断开链接,触发此方式
        :param message:
        :return:
        """
        # 服务端触发异常 StopConsumer
        USER_list.remove(self)  # 将每一个链接的用户从列表中删除
        raise StopConsumer

至此,就简朴实现了多人在线谈天的功效。

 

,

Sunbet

Sunbet www.351125.com Sunbet是进入Sunbet(www.sunbet.us)的主力站点。Sunbet开放Sunbet会员开户网址、Sunbet代理开户、Sunbet手机版下载、Sunbet电脑客户端下载等业务。

皇冠APP声明:该文看法仅代表作者自己,与本平台无关。转载请注明:新余论谈:Django使用channel实现websocket

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:354
  • 页面总数:0
  • 分类总数:8
  • 标签总数:737
  • 评论总数:59
  • 浏览总数:3252