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中requests模块的使用方法
Apr 08 Python
Python中的super用法详解
May 28 Python
Tensorflow环境搭建的方法步骤
Feb 07 Python
python如何修改装饰器中参数
Mar 20 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
Python flask框架端口失效解决方案
Jun 04 Python
python用Configobj模块读取配置文件
Sep 26 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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使用GeoIP库实例
2014/06/27 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
SVG实现时钟效果
2018/07/17 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
浅析python继承与多重继承
2018/09/13 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
pandas重新生成索引的方法
2018/11/06 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
幼儿园家长会邀请函
2014/01/15 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
汽车车尾标语大全
2015/08/11 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
java实现面板之间切换功能
2022/06/10 Java/Android