2017-02-21 87 views
2

在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函數中接受連接請求的正確方法是什麼?

回答

1

我遇到了同樣的問題。 Websocket規範說,如果客戶要求一個子協議,那麼服務器必須做出響應,讓客戶知道它支持它。在我的情況的子協議是「graphql-WS」

在石墨烯代碼它最終蒸發了,這是添加以下的設置一個簡單的情況下四處之後:

CHANNELS_WS_PROTOCOLS = ["graphql-ws"]

所以,只需用你想支持的任何東西來替換協議列表即可。當然,一旦你完成了這個工作,你實際上需要在服務器上實現子協議。

0

您必須指定要在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"})