python-websocket
1.介绍
WebSocket是一种在单个TCP连接上进行全双工通信的协议
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输,也就是不通过客户端想服务端发请求,服务端也能主动返回数据给客户端
django实现websocket大致上有两种方式,一种channels,一种是dwebsocket。channels依赖于redis,twisted等,相比之下使用dwebsocket要更为方便一些
2.安装
pip3 install dwebsocket
3.配置
在settings.py中配置以下内容:
INSTALLED_APPS = [
.....
.....
'dwebsocket',
]
WEBSOCKET_ACCEPT_ALL = True
4.使用
目录结构:
urls.py:
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test1/',views.test1),
]
views.py:
from .models import Book
from dwebsocket.decorators import accept_websocket
@accept_websocket
def test1(request):
print(request.is_websocket()) # True 判断是否是websocket请求,如果是websocket时,request会自动多出一个websocket属性
while True:
time.sleep(1)
if request.is_websocket():
'''简单举例,如果Book表中没有数据则不做任何操作'''
count = Book.objects.all().count()
if count:
'''如果Book表有数据,返回有数据,并且退出while True'''
'''request.websocket.send是向前端发送数据,以二进制形式发送'''
request.websocket.send('有数据啦'.encode('utf8'))
break
5.使用postman测试websocket
刚进入postman我们需要建立一个workspace,但是此时的workspace request是灰色的,我们需要首先登陆postman账户
建立好workspace之后新建一个窗口,发送请求。此时我们使用的不再是http协议,而是websocket协议,所以我们的路由前缀需要变成ws://
只要Response栏中出现Connected以及绿色的对钩,说明前后端已经成功通信
这时代码已经进入到了While True当中,由于Book表中未插入任何数据,所以也不会返回给前端任何数据。此时我们通过另一个接口给Book插入一条数据:
初始状态:
这样我们就可以在表中某一条数据发生变化时,主动从后端向前端发送消息