Django websocket原理及功能实现代码

作者:迎风而来 时间:2023-04-18 16:49:11 

一 什么是Websocket

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

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输

现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。

在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯

二 Django实现Websocket

django实现websocket大致上有两种方式,一种channels,一种是dwebsocket。channels依赖于redis,twisted等,相比之下使用dwebsocket要更为方便一些

三 dwebsocket安装

pip3 install dwebsocket

四 dwebsocket配置


INSTALLED_APPS = [
 .....
 .....
 'dwebsocket',
]

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

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

五 使用

html代码:


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</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>

views视图层:


from django.shortcuts import render,HttpResponse

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

from dwebsocket.decorators import accept_websocket
@accept_websocket
def path(request):
 if request.is_websocket():
   print(1)
   request.websocket.send('下载完成'.encode('utf-8'))

路由层:


from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^login/', views.login),
 url(r'^path/', views.path),
]

六 详解

#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/sui776265233/p/10176275.html

标签:Django,websocket
0
投稿

猜你喜欢

  • python实现二维码扫码自动登录淘宝

    2022-09-22 07:18:02
  • django与小程序实现登录验证功能的示例代码

    2023-08-04 01:06:58
  • python函数装饰器构造和参数传递

    2023-05-24 16:49:17
  • PyQt5实现数据的增删改查功能详解

    2021-03-30 06:50:07
  • CSS Shadow Practice

    2009-04-01 18:37:00
  • SQL SERVER 2008 CTE生成结点的FullPath

    2024-01-16 08:04:29
  • Oracle数据库中表空间的基本管理操作小结

    2024-01-26 23:18:26
  • pytest实现测试用例参数化

    2023-12-10 19:01:21
  • JS常见错误(Error)及处理方案详解

    2024-04-22 22:24:34
  • python编写朴素贝叶斯用于文本分类

    2022-01-29 18:45:51
  • MySQL中时间函数操作大全

    2024-01-14 19:45:11
  • Python使用numpy实现BP神经网络

    2021-11-26 22:16:32
  • insert select与select into 的用法使用说明

    2012-01-05 18:47:58
  • WML初级教程之从实际应用中了解WML

    2008-09-04 11:24:00
  • 关于Python函数的定义和参数

    2021-05-08 20:37:28
  • python识别图像并提取文字的实现方法

    2023-06-07 18:36:36
  • 你的网站使用了微格式了么

    2009-05-21 12:10:00
  • php微信开发之批量生成带参数的二维码

    2023-11-23 19:27:11
  • Python实现PDF转MP3的示例代码

    2021-08-07 21:21:06
  • python将unicode和str互相转化的实现

    2023-07-17 21:36:34
  • asp之家 网络编程 m.aspxhome.com