在 Django Channels 中重用现有的 websocket

2023-12-10

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

Overview

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

Question

Django 允许我轻松地在套接字上接收帧,并对所述帧进行操作。我遇到的麻烦是通过现有管道发送一条消息:我一生都无法调用WebsocketConsumer.send()方法,甚至通过包装器,来自一个方法not在消费者中,但在其他地方定义并接收消费者作为参数(到目前为止我能想到的最好的)。有没有可能(这个问题实际上指向它not有可能)?

预先感谢您的任何指点。如果需要的话,明天我可以在课堂上更新这个问题。


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

所以假设你想打电话给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!",
})

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

您链接的问题使用龙卷风 websockets,这与 Django 通道有很大不同。我不知道是否可以使用龙卷风,但使用通道肯定可以

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django Channels 中重用现有的 websocket 的相关文章