重用Django Channels中的现有websocket

时间:2018-07-09 18:01:18

标签: python django websocket django-channels

我正在用Python进行半认真的研究,以在受限访问系统和GAE应用程序之间创建某种网守服务器。在可能涉及到与代码相关的特定问题之前,我将先从一个更笼统的问题开始。

概述

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

问题

Django使我可以轻松地在套接字上接收帧,并对这些帧进行操作。我遇到的问题是在现有管道上发送消息:我一生都无法通过 not 的方法调用WebsocketConsumer.send()方法,即使是通过包装器也是如此在使用者中,但在其他地方定义并接收使用者作为参数(到目前为止,我能提出的最好的)。甚至有可能(this question指出实际上不可能是可能的)?

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

1 个答案:

答案 0 :(得分:1)

也许已经为时已晚,但是您需要做的是直接向应用程序正在收听的频道或群组发送一条消息。渠道会将您的消息路由到适当的使用方方法。

因此,假设您想在服务其他应用程序的使用者(例如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渠道大不相同。我不知道使用龙卷风是否是possiblle,但使用渠道肯定是