Django websocket原理及功能实现代码


Posted in Python onNovember 14, 2020

一 什么是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类型

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python记录程序运行时间的三种方法
Jul 14 Python
详解python中的线程
Feb 10 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
python提取照片坐标信息的实例代码
Aug 14 Python
利用Python校准本地时间的方法教程
Oct 31 Python
python将数组n等分的实例
Dec 02 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
Python用input输入列表的实例代码
Feb 07 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
OpenCV灰度化之后图片为绿色的解决
Dec 01 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 Python
Pycharm常用快捷键总结及配置方法
Nov 14 #Python
Django model class Meta原理解析
Nov 14 #Python
详解python爬取弹幕与数据分析
Nov 14 #Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 #Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 #Python
基于Python的身份证验证识别和数据处理详解
Nov 14 #Python
Python join()函数原理及使用方法
Nov 14 #Python
You might like
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
js调用css属性写法
2013/09/21 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python datetime包函数简单介绍
2019/08/28 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
绿色城市实施方案
2014/03/19 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
班风学风建设方案
2014/05/06 职场文书
自主招生推荐信范文
2014/05/10 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
小学领导班子对照材料
2014/08/23 职场文书
AJAX学习笔记
2021/05/18 Javascript
JS实现扫雷项目总结
2021/05/19 Javascript