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.使用

目录结构:
image
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账户
image
建立好workspace之后新建一个窗口,发送请求。此时我们使用的不再是http协议,而是websocket协议,所以我们的路由前缀需要变成ws://
image
只要Response栏中出现Connected以及绿色的对钩,说明前后端已经成功通信
image
这时代码已经进入到了While True当中,由于Book表中未插入任何数据,所以也不会返回给前端任何数据。此时我们通过另一个接口给Book插入一条数据:
初始状态:
image
image
image
image
image
这样我们就可以在表中某一条数据发生变化时,主动从后端向前端发送消息

posted @ 2023-06-28 18:06  ERROR404Notfound  阅读(17)  评论(0编辑  收藏  举报
Title