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制作爬虫抓取美女图
Jan 20 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
python 提高开发效率的5个小技巧
Oct 19 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
详解python日志输出使用配置文件格式
Feb 10 Python
90行Python代码开发个人云盘应用
Apr 20 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 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
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
python 获取字符串MD5值方法
2018/05/29 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python常用类型转换实现代码实例
2020/07/28 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
一份Java笔试题
2012/02/21 面试题
西部世纪面试题
2014/12/05 面试题
服务理念口号
2014/06/11 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
项目建议书
2015/02/04 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
python爬取某网站原图作为壁纸
2021/06/02 Python
压缩Redis里的字符串大对象操作
2021/06/23 Redis
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
Java数组详细介绍及相关工具类
2022/04/14 Java/Android