Django Channels - WebSockets:找不到在任何地方定义的 websocket_accept 方法

Django Channels - WebSockets: Cannot find websocket_accept method defined anywhere

可能有点傻,但我真的想不通。

我正在查看 Django Channels 的源代码,以了解哪种是从服务器手动终止打开的 Web 套接字连接的最佳方式。然后我注意到 WebsocketConsumeraccept 方法发送了 websocket.accept 类型的消息: https://github.com/django/channels/blob/master/channels/generic/websocket.py#L52

根据 Django Channel docs,这意味着某处有一个名为 websocket_accept 的方法将在消费者上调用:

Consumers are structured around a series of named methods corresponding to the type value of the messages they are going to receive, with any . replaced by _.

但是我在存储库中的任何地方都找不到 websocket_accept 方法(我什至克隆了它并 grep 到它)。

websocket_close 也是如此:https://github.com/django/channels/blob/master/channels/generic/websocket.py#L88。在哪里定义的?

所以我想知道这是如何工作的。我是不是解释错了,或者文档有不同的意思(例如,应该调用其他方法而不是我认为他们会调用的方法)?

谢谢

消费者处理程序分为协议处理程序(为 websocket 消费者预置 websocket 的那些,如 websocket_disconnect 等)和实例级处理程序(没有预置的 websocket,如 disconnect)。

协议处理程序通常通过通道层处理从消费者实例外部发送的请求。它可以从下游消费者发送到上游消费者,如果当前消费者未处理,则进一步向上游发送,直到 websocket 服务器。

由于 ASGI 协议是“一路向下的海龟”,所有使用 websocket 协议服务器的消费者行为相似,并且实现了相似的处理程序。

本质上,您没有看到 websocket_accept 处理程序,因为通道中没有通用消费者处理它,因此,它将由您正在使用的 websocket 服务器处理。这个特定事件触发连接从 HTTP 升级到 websocket,这是由 websocket 服务器完成的。同样对于 websocket_close,它被发送到上游,websocket 服务器通过关闭 websocket 连接来处理它。 您可以找到有关 ASGI 协议中定义的处理程序的更多信息 here

请注意,如果您有依赖于父消费者的子消费者(例如 Demultiplexer implemented here 的情况),那么您可以拥有像 websocket_accept 这样的协议处理程序,但必须确保您发送它更上游到 websocket 服务器,否则将无法正确处理并且连接不会升级