在 Django Channels 中重用现有的 websocket

Reusing an existing websocket in Django Channels

我正在半认真地使用 Python 在受限访问系统和 GAE 应用程序之间创建一种看门人服务器。我将从一个更笼统的问题开始,然后可能会继续讨论与代码相关的特定问题。

概览

限制访问系统使用命令行 Python 应用程序设置,该应用程序打开到中间服务器上的 Django Channels 应用程序 运行 的 WebSocket 连接,并开始发送定期心跳框架,Django 应用程序承认。到目前为止,一切都很好。 时不时地,Django 应用程序会收到一个 HTTP 请求,它会验证该请求,如果通过,它会向其他系统发送指令。现在,为了提高效率,我想到了重新使用现有的 WS 连接并搭载指令框架。

问题

Django 允许我轻松地在套接字上接收帧,并对所述帧进行操作。我遇到的问题是通过现有管道发送消息:我一生都无法从 not[= 的方法调用 WebsocketConsumer.send() 方法,即使通过包装器也是如此26=] 在消费者中,但在其他地方定义并接收消费者作为参数(迄今为止我能想到的最好的)。甚至可能吗(this question实际上指向它而不是是可能的)?

提前感谢您的指点。如果需要,明天我可以用 类.

更新问题

也许已经太晚了,但您需要做的是直接向应用程序正在收听的频道或群组发送消息。 Channels 会将您的消息路由到适当的消费者方法。

所以假设你想在为你的其他应用程序服务的消费者中调用 send_message 方法(比如 channel1):你应该这样做:

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync

channel_layer = get_channel_layer()
sync_to_async(channel_layer.send)("channel1", {
    "type": "send.message",
    "text": "Hello there!",
})

这可以在您的代码中的任何位置完成。

您链接的问题使用了与 Django 通道完全不同的 tornado websockets。我不知道是否可以使用龙卷风,但肯定可以,使用 Channels