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基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
详解python 3.6 安装json 模块(simplejson)
Apr 02 Python
python使用建议技巧分享(三)
Aug 18 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 Python
使用python创建股票的时间序列可视化分析
Mar 03 Python
使用python绘制分组对比柱状图
Apr 21 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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
实用函数8
2007/11/08 PHP
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
jQuery使用手册之一
2007/03/24 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
Python学习小技巧之列表项的排序
2017/05/20 Python
Python金融数据可视化汇总
2017/11/17 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
护理学中专毕业生求职信
2013/11/11 职场文书
物业招聘计划书
2014/01/10 职场文书
基层党员对照检查材料
2014/09/24 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书