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中for循环详解
Jan 17 Python
Python之父谈Python的未来形式
Jul 01 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
python验证身份证信息实例代码
May 06 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
Python异常类型以及处理方法汇总
Jun 05 Python
python基础之函数的定义和调用
Oct 24 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
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
javascript 简练的几个函数
2009/08/29 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
Python3访问并下载网页内容的方法
2015/07/28 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
高中教师考核方案
2014/05/18 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
个人党性分析材料
2014/12/19 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
vue修饰符.capture和.self的区别
2022/04/22 Vue.js