这是我参与11月更文挑战的第30天,活动详情查看:2021最后一次更文挑战
目的:实现websocket请求,客户端和服务端实现双工通信(客户端与服务端通过websocket连接成功后,可以双向地主动发消息)
- 与django推荐的channel不同,dwebsocket使用更加方便简单
- channels依赖于redis,twisted等,相比之下使用dwebsocket要更为方便一些
WebSocket的工作流程是这 样的:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小了很多.
dwebsocket 相关网站
安装dwebsocket
1 | undefined复制代码pip3 install dwebsocket |
注册APP
注册之后才能使用dwebsocket
1 | python复制代码INSTALLED_APPS = [ |
使用
使用的方法有两种情况,如下:
- 第一种则是在配置文件中设置中间件,配置所有视图都可以接收使用websocket功能。
- 第二种则是利用修饰器的方式单独对某个视图进行增加websocket功能。
第一种:全局配置
在django项目的配置文件的中间件中配置,这种情况下需要每一个视图函数都使用websocket通信,否则报错。
1 | python复制代码MIDDLEWARE_CLASSES = [ |
第二种:装饰器单一视图使用
只需views.py文件中,将对应的视图函数添加装饰器
- accept_websocket-—可以接受websocket请求和普通http请求
- require_websocket—-只接受websocket请求,拒绝普通http请求
如果使用了require_websocket,但使用了普通http请求,则出现Bad Request的报错信息
补充相关方法
1 | python复制代码相关方法函数说明 |
案例演示1
视图函数使用装饰器的方式,浏览器客户端与服务端使用websocket通信,增加websocket停止以及重连功能
views.py
1 | python复制代码from django.shortcuts import render |
test_websocket.html
【坑】:注意发送ws请求时,url后面加上”/“
1 | python复制代码<!DOCTYPE html> |
urls.py
1 | python复制代码from django.conf.urls import url |
演示2:websocket连接成功后,服务端主动发消息
views.py
修改上述视图文件
1 | python复制代码from django.shortcuts import render |
dwebsocket的坑
背景:客户端无法自动断开websocket链接,导致django无法处理上一次遗留的websocket客户端从而引起的报错。
方法:调用window.beforunload,在浏览器
1 | javascript复制代码 window.onbeforeunload = function () { |
刷新,或者关闭页面的时候,自动关闭websocket链接
结语
文章首发于微信公众号程序媛小庄,同步于掘金。
码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)
本文转载自: 掘金