首页 > 解决方案 > 在 Django Channels 中重用现有的 websocket

问题描述

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

概述

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

问题

Django 让我可以轻松地接收套接字上的帧,并对所述帧采取行动。我遇到的问题是通过现有管道发送消息:WebsocketConsumer.send()即使通过包装器,我也无法从不在消费者中但在其他地方定义并接收消费者的方法调用该方法一个参数(到目前为止我能想到的最好的)。甚至可能(这个问题指出它实际上是不可能的)?

在此先感谢您的任何指点。如果需要,明天我可以用我的课程更新问题。

标签: pythondjangowebsocketdjango-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 频道完全不同的龙卷风 websockets。我不知道是否可以使用龙卷风,但绝对可以,使用频道


推荐阅读