利用dwebsocket在Django中使用Websocket

 

一、Websockets介绍

  HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

  在2008年诞生,2011年成为国际标准。

  现在基本所有浏览器都已经支持了。

  WebSocket是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连接后传输一次握手数据),两者之间就直接可以创建持久性的连接,并进行双向数据传输。

     在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。
  轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。

(官方链接)https://pypi.org/project/dwebsocket/0.4.2/

二、安装dwebsocket

通过pip

pip install  dwebsocket2

三、使用方法

如果你想为一个单独的视图处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由到视图中。使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。

在设置中添加设置MIDDLEWARE_CLASSES=dwebsocket.middleware.WebSocketMiddleware这样会拒绝单独的视图实用websocket,必须加上accept_websocket 装饰器。

设置WEBSOCKET_ACCEPT_ALL=True可以允许每一个单独的视图实用websockets

一些方法和属性

1.request.is_websocket()

如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。

2.request.websocket

在一个websocket请求建立之后,这个请求将会有一个websocket属性,用来给客户端提供一个简单的api通讯,如果request.is_websocket()是False,这个属性将是None。

3.WebSocket.wait()

返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None

4.WebSocket.read()

 如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法

5.WebSocket.count_messages()

 返回消息队列数量

6.WebSocket.has_messages()

 如果有新消息返回True,否则返回False

7.WebSocket.send(message)

 向客户端发送消息

8.WebSocket.__iter__()

 websocket迭代器

四:用django 和 websocket 实现 一个简单的 全双工通信

功能:每隔一秒像前端发送时间

<!DOCTYPE html>
<html>
<head>
    <title>django-websocket</title>
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script type="text/javascript">//<![CDATA[
    $(function () {
     var socket = new WebSocket("ws://" + window.location.host + "/echo_once/");
     socket.onmessage = function (e) {
          console.log('message: ' + e.data);//打印服务端返回的数据
          $('#messagecontainer').prepend('<p>' + e.data + '</p>');
    });
    //]]></script>
</head>
<body>
<br>
<h1>Received Messages</h1>
<div id="messagecontainer">

</div>
</body>
</html>

app的views.py编写我们的服务端

from dwebsocket.decorators import accept_websocket,require_websocket

@accept_websocket
def echo_once(request):
    if request.is_websocket():
        while 1:
            time.sleep(1) ## 向前端发送时间
            dit = {
                'time':time.strftime('%Y.%m.%d %H:%M:%S',time.localtime(time.time()))
            }
            request.websocket.send(json.dumps(dit))

路由配置

from demo import views as v

urlpatterns = [

    url(r'^index/', v.index),
    url(r'^echo_once', v.echo_once),
]

 
















posted on 2021-07-11 12:19  paike123  阅读(263)  评论(0编辑  收藏  举报

导航