• Django实现websocket


    django实现websocket大致上有两种方式,一种channels,一种是dwebsocket。channels依赖于redis,twisted等,相比之下使用dwebsocket要更为方便一些。

    安装:

    pip install dwebsocket

    配置:

    
    INSTALLED_APPS = [
        .....
        .....
        'dwebsocket',
    ]
     
    MIDDLEWARE_CLASSES = [
        ......
        ......
        'dwebsocket.middleware.WebSocketMiddleware'  # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
     
    ]
    
    WEBSOCKET_ACCEPT_ALL=True   # 可以允许每一个单独的视图实用websockets
    

    简单使用:
    模拟文件下载的简单示例

    
    from dwebsocket.decorators import accept_websocket
    @accept_websocket
    def test(request):
        if not request.is_websocket():  # 判断是不是websocket连接
            return render(request, 'websocket.html')
        else:
            download = Haproxy()
            t = threading.Thread(target=download.run)
            t.start()
            sent = []
            while download.status:
                if len(download.res_dict) > len(sent):
                    for i in download.res_dict.keys():
                        if i not in sent:
                            sent.append(i)
                    request.websocket.send(str(sent[-1]+str(download.res_dict[sent[-1]])).encode('utf-8'))  # 发送消息到客户端
            if not download.status:
                request.websocket.send('下载完成'.encode('utf-8'))
    

    详细:

    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类型

  • 相关阅读:
    xdvipdfmx:fatal: Unable to open "xxx.pdf". Output file removed. fwrite: Broken pipe xelatex.exe
    安装Visual Studio 时窗口闪过就退出
    一些概念的收集
    如何让字符串中奇怪的空格现出原形
    mysql替换特殊字符
    asscii码对应表
    Linux下的tar压缩解压缩命令详解
    centos 6.8 /etc/sysconfig/下没有iptables的问题
    mysqldumpslow简单用法
    linux查询占用空间较大的文件
  • 原文地址:https://www.cnblogs.com/bigox/p/11536443.html
Copyright © 2020-2023  润新知