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 BeautifulSoup库抓取58手机维修信息
Nov 21 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python实现的文本编辑器功能示例
Jun 30 Python
实例讲解python中的序列化知识点
Oct 08 Python
Python通用循环的构造方法实例分析
Dec 19 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 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 cron中的批处理
2008/09/16 PHP
深入解析php之apc
2013/05/15 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
Python 12306抢火车票脚本
2018/02/07 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
python nmap实现端口扫描器教程
2020/05/28 Python
Python字符串格式化输出代码实例
2019/11/22 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
EJB的基本架构
2016/09/22 面试题
客服文员岗位职责
2013/11/29 职场文书
暑期实习鉴定
2013/12/16 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书