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编写类UNIX系统的命令行工具的教程
Apr 15 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
python中私有函数调用方法解密
Apr 29 Python
python daemon守护进程实现
Aug 27 Python
详解python中的json的基本使用方法
Dec 21 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
pytorch MSELoss计算平均的实现方法
May 12 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/12/29 PHP
php无限遍历目录示例
2014/02/21 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
JavaScript类属性的访问方式详解
2014/02/11 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
原生JS实现前端本地文件上传
2018/09/08 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python全排列操作实例分析
2018/07/24 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python使用配置文件过程详解
2019/12/28 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
大四学生毕业自荐信
2013/11/07 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
煤矿安全协议书
2014/08/20 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
爱国主题班会教案
2015/08/14 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
详解Nginx 工作原理
2021/03/31 Servers