在django使用websocket

websocket的应用

1.什么是websocket?

websocket是一种在单个TCP连接上进行的全双工通信协议。

websocket使得server端和client端之间的数据交互变得更加容易。

在Websocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

目前,很多网站为了实现推送技术,使用的都是轮询技术,即过一段时间(1MS)向服务端发送HTTP请求。这种轮询方式很浪费资源。

2.在Django中实现websocket

在django中实现websocket主要有两种方式:(1)借助channels;(2)使用dwebsocket;

第一种借助channels依赖于redis、twisted等。

3.安装 dwebsocket

pip install dwebsocket

4.配置

(1)注册APP

INSTALLED_APPS = [
    ...
    'app01.apps.App01Config',
    'rest_framework', # DRF框架
    'dwebsocket', # websocket
]

(2)为所有的URL提供websocket(可选步骤)

MIDDLEWARE_CLASSES = [
    ......
    ......
    'dwebsocket.middleware.WebSocketMiddleware'  # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
 
]

(3)允许每个单独的视图使用websocket

WEBSOCKET_ACCEPT_ALL=True   # 可以允许每一个单独的视图实用websockets

5.使用

views.py

from django.shortcuts import render

from dwebsocket.decorators import accept_websocket

# Create your views here.
def login(request,*args,**kwargs):
    return render(request,'login.html')

@accept_websocket
def send_message(request,*args,**kwargs):
    if request.is_websocket():
        request.websocket.send('博主真NB'.encode('utf-8'))

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>NB</title>
</head>
<body>
<button onclick="WebSocketTest()">test</button>
</body>
<script>
    function WebSocketTest() {
        alert(1);
        if ("WebSocket" in window) {
            alert("您的浏览器支持 WebSocket!");
            // 打开一个 web socket
            ws = new WebSocket("ws://127.0.0.1:8000/path/");
            ws.onopen = function () {
                // Web Socket 已连接上,使用 send() 方法发送数据
                ws.send("发送数据");
                alert("数据发送中...");
            };
            ws.onmessage = function (evt) {
                var received_msg = evt.data;
                alert("数据已接收...");
                alert("数据:" + received_msg)
            };
            ws.onclose = function () {
                // 关闭 websocket
                alert("连接已关闭...");
            };
        }
        else {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }
    }
</script>
</html>

6.详解

#dwebsocket有两种装饰器:require_websocket和accept_websocekt,使用require_websocket装饰器会导致视图函数无法接收导致正常的http请求,一般情况使用accept_websocket方式就可以了,
# 
# dwebsocket的一些内置方法:
# 
# request.is_websocket():判断请求是否是websocket方式,是返回true,否则返回false
# request.websocket: 当请求为websocket的时候,会在request中增加一个websocket属性,
# WebSocket.wait() 返回客户端发送的一条消息,没有收到消息则会导致阻塞
# WebSocket.read() 和wait一样可以接受返回的消息,只是这种是非阻塞的,没有消息返回None
# WebSocket.count_messages()返回消息的数量
# WebSocket.has_messages()返回是否有新的消息过来
# WebSocket.send(message)像客户端发送消息,message为byte类型
原文地址:https://www.cnblogs.com/surpass123/p/13546395.html