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 24 Python
九步学会Python装饰器
May 09 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
python实现简单flappy bird
Dec 24 Python
python+mysql实现教务管理系统
Feb 20 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 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 和 MySQL 基础教程(二)
2006/10/09 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
Python如何测试stdout输出
2020/08/10 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
策划创业计划书
2014/02/06 职场文书
担保书格式及范文
2014/04/01 职场文书
教师师德演讲稿
2014/05/06 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
商业计划书之服装
2019/09/09 职场文书
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL
V Rising 服务器搭建图文教程
2022/06/16 Servers