Django频道。如何用子协议响应WebSocket打开请求?

Kim*_* SJ 5 python django websocket channels

在JavaScript中,浏览器可以将子协议指定为WebSocket创建中的第二个参数:

socket=new WebSocket(url, subprotocol)
Run Code Online (Sandbox Code Playgroud)

试用Chrome,它会作为Sec-WebSocket-Protocol标头中的元素正确发送到服务器。

使用Django渠道,一个简单的使用者

def ws_add(message):
    message.reply_channel.send({"accept": True,})
Run Code Online (Sandbox Code Playgroud)

给出错误

WebSocket与“ xxx”的连接失败:WebSocket握手期间出错:发送了非空的“ Sec-WebSocket-Protocol”标头,但未收到任何响应。

在Django频道的ws_add函数中接受连接请求的正确方法是什么?

小智 6

您必须指定要在websocket.accept消息中使用的子协议。例如,如果您子类化channels.generic.websocket.WebsocketConsumer(也适用于SyncConsumer)并使用Sec-WebSocket-Protocolof my-protocol

class MyProtocolConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        self.base_send({"type": "websocket.accept", "subprotocol": "my-protocol"})
Run Code Online (Sandbox Code Playgroud)