python - Django channel 。如何使用子协议(protocol)响应 WebSocket 打开请求?

标签 python django websocket channels

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

socket=new WebSocket(url, subprotocol)

在 Chrome 中进行实验,这会作为 header 中的 Sec-WebSocket-Protocol 元素正确发送到服务器。

使用Django channel ,一个简单的消费者

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

给出错误

WebSocket connection to 'xxx' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received.

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

最佳答案

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

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

关于python - Django channel 。如何使用子协议(protocol)响应 WebSocket 打开请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357140/

相关文章:

python - 在 Pandas 中部分拆分字符串列

python - 编辑 django-cms 页面时出现 TransactionManagementError

c++ - C++ 中的 Websocket 客户端

javascript - 使用 socket.io 进行服务器端验证

python - 使用 sudo 运行 Django 找不到已安装的 Homebrew 程序包

python - 高速公路 Websocket : listen to local port and transfer messages to clients connected to a public port

python - 你如何告诉 pylint protobuf 生成的对象的成员是什么?

python - 如何使数据框中的每一行的每一列都有一个值?

python - 如何在代理后禁用 Django 的 CSRF 保护

python - 如何在 Celery 中传递连接详细信息