【问题标题】:Reusing an existing websocket in Django Channels在 Django Channels 中重用现有的 websocket
【发布时间】:2018-12-17 11:45:34
【问题描述】:

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

概述

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

问题

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

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

【问题讨论】:

    标签: python django websocket django-channels


    【解决方案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 频道完全不同的龙卷风 websockets。我不知道是否可以使用龙卷风,但绝对可以,使用频道

    【讨论】:

    • 结果确实为时已晚,但既然你至少回答了这个问题,那么你应该得到公认的答案。
    • 您好,我有一个疑问,如何获取频道名称?我正在尝试将 api 响应推送到涉及两个用户的实时 websocket。所以为了实现这一点,我怎样才能获得 channel_name?谢谢
    • @Danny 在这种情况下,您必须在数据库中保留频道名称的清单,或者为每个用户创建一个组,该组具有用户唯一的已知 ID(可能是用户数据库 ID例如),然后每当您想向该用户发送消息时,您只需将其发送到您可以轻松从数据库中检索其 id 的组。第二个选项更好,尤其是在用户可以从多个设备连接的情况下
    • 感谢您的回复。您的意思是创建频道组吗?
    • 是的,一个频道组
    猜你喜欢
    • 2021-07-24
    • 2018-05-11
    • 1970-01-01
    • 2020-10-26
    • 2022-01-12
    • 2021-07-03
    • 2021-05-12
    • 2019-05-03
    • 2020-06-26
    相关资源
    最近更新 更多