2017-02-21 8 views
2

В JavaScript браузер может указать суб-протокол в качестве второго параметра в создании WebSocket:Django Каналы. Как ответить на открытый запрос WebSocket с помощью подпротокола?

socket=new WebSocket(url, subprotocol) 

Экспериментируя с Chrome, это правильно отправляется на сервер в качестве Sec-WebSocket-Protocol элемента в заголовке.

Использование Django каналов, простой потребитель

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

дает ошибку

WebSocket подключение к 'ххх' не удалось: Ошибка при WebSocket рукопожатия: Прислал непустой «Sec-WebSocket-протоколу ', но ответа не получено.

Каков правильный способ принять этот запрос на соединение в функции ws_add каналов Django?

ответ

1

У меня была такая же проблема. Спецификация Websocket говорит, что если клиент запрашивает подпротокол, сервер должен ответить, чтобы клиент знал, что он его поддерживает. В моем случае подпротокол был «graphql-WS»

После покопаться в графене коде в конце концов выяснилось, что это простой случай добавив следующие настройки:

CHANNELS_WS_PROTOCOLS = ["graphql-ws"]

Итак, просто замените список протоколов тем, что вы хотите поддержать. Конечно, как только вы это сделали, вам действительно нужно реализовать подпротокол на сервере.

0

Вы должны указать подпротокол для использования в сообщении 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"}) 

 Смежные вопросы

  • Нет связанных вопросов^_^