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

问题描述:

在JavaScript的浏览器可以指定一个子协议如在​​网页套接字创建的第二个参数:Django频道。如何用子协议响应WebSocket打开请求?

socket=new WebSocket(url, subprotocol) 

用铬进行实验,这是正确地发送到服务器如在标头中Sec-WebSocket-Protocol元件。

使用Django渠道,一个简单的消费

def ws_add(message): 
    message.reply_channel.send({"accept": True,}) 

给出了错误

WebSocket连接到 'XXX' 失败:WebSocket的握手过程中的错误:发送非空“仲的WebSocket协议'标题,但没有收到回应。

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

我遇到了同样的问题。 Websocket规范说,如果客户要求一个子协议,那么服务器必须做出响应,让客户知道它支持它。在我的情况的子协议是“graphql-WS”

在石墨烯代码它最终蒸发了,这是添加以下的设置一个简单的情况下四处之后:

CHANNELS_WS_PROTOCOLS = ["graphql-ws"]

所以,只需用你想支持的任何东西来替换协议列表即可。当然,一旦你完成了这个工作,你实际上需要在服务器上实现子协议。

您必须指定要在websocket.accept消息中使用的子协议。例如,如果你继承channels.generic.websocket.WebsocketConsumer(也SyncConsumer作品),并使用Sec-WebSocket-Protocolmy-protocol的:

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