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定时器(Timer)用法简单实例
Jun 04 Python
详解python做UI界面的方法
Feb 27 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
如何验证python安装成功
Jul 06 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
python制作抽奖程序代码详解
Jan 15 Python
Python机器学习三大件之一numpy
May 10 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中一些可能会被忽略的问题
2013/06/21 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
php车辆违章查询数据示例
2016/10/14 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
python实现保存网页到本地示例
2014/03/16 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
python调用java的jar包方法
2018/12/15 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
Keras自定义IOU方式
2020/06/10 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
中学老师的自我评价
2013/11/07 职场文书
住房公积金接收函
2014/01/09 职场文书
党员组织关系介绍信
2014/02/13 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python