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-Protocol
my-protocol
的:
class MyProtocolConsumer(WebsocketConsumer):
def websocket_connect(self, message):
self.base_send({"type": "websocket.accept", "subprotocol": "my-protocol"})