Django Channels 拒绝使用自定义代码的 websocket 连接

问题描述 投票:0回答:1

因此我需要使用特定代码拒绝 Websocket 连接,以便客户端可以正确处理拒绝。目前,当您拒绝连接时:

message.reply_channel({'accept': False}) 

客户端简单地得到一个

403
错误。

我可以使用代码关闭连接:

message.reply_channel({'close':3000})

但这需要首先接受连接。如果这是唯一的方法,那就这样吧,但我觉得应该有一种方法可以用我根本找不到的代码来拒绝。

我正在使用 Django Channels 1.1.8,因此不幸的是 2.x 版本的更改对我没有好处。

python django django-channels
1个回答
0
投票

对于后代,要在 Django Channels 1.1.8 中的握手期间关闭连接,请使用:

message.reply_channel.send({'accept': False})

当您在握手阶段关闭时,根据 ASGI 规范,符合 ASGI 的服务器必须以 HTTP

403
状态代码关闭连接,并且不完成 WebSocket 握手。您无法使用 WebSocket 协议指定的不同 HTTP 状态代码关闭连接。

101
之外的任何状态代码都表示 WebSocket 握手尚未完成,并且 HTTP 语义仍然适用

——WebSocket 协议规范.

在符合 ASGI 的服务器中是不允许的。

关闭—

send
活动

由应用程序发送,告诉服务器关闭连接。

如果在接受套接字之前发送此消息,则服务器必须关闭连接并显示 HTTP

403
错误代码(禁止),并且不完成 WebSocket 握手。

——ASGI规范.

总而言之,这不是框架的错,而是ASGI规范的错。

© www.soinside.com 2019 - 2024. All rights reserved.