python - 在 Django Channels 中重用现有的 websocket
问题描述
我正在半认真地使用 Python 来在受限访问系统和 GAE 应用程序之间创建一种网守服务器。我将从一个更一般的问题开始,然后可能会转到与代码相关的特定问题。
概述
受限访问系统设置有一个命令行 Python 应用程序,该应用程序打开与运行在中间服务器上的 Django Channels 应用程序的 WebSocket 连接,并开始发送常规的心跳帧,Django 应用程序会对此进行确认。到目前为止,一切都很好。时不时地,Django 应用程序会收到一个 HTTP 请求,它将对其进行验证,如果通过,它将向其他系统发送一条指令。现在,为了提高效率,我有了重新使用现有 WS 连接并在其上搭载指令框架的想法。
问题
Django 让我可以轻松地接收套接字上的帧,并对所述帧采取行动。我遇到的问题是通过现有管道发送消息:WebsocketConsumer.send()
即使通过包装器,我也无法从不在消费者中但在其他地方定义并接收消费者的方法调用该方法一个参数(到目前为止我能想到的最好的)。甚至可能(这个问题指出它实际上是不可能的)?
在此先感谢您的任何指点。如果需要,明天我可以用我的课程更新问题。
解决方案
也许已经为时已晚,但您需要做的是将消息直接发送到应用程序正在收听的频道或组。通道会将您的消息路由到适当的消费者方法。
因此,假设您想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。我不知道是否可以使用龙卷风,但绝对可以,使用频道
推荐阅读
- string - 在 Bash 脚本中,如何以逗号分隔的方式打印带有字符和数字变量的字符串?
- c# - iTextSharp 填充现有的 pdf,但多行文本字段不会换行
- html - 如何在从 pandas Dataframe 呈现的 HTML 表中实现行跨度?
- jdbc - 数据库查询错误 - [Macromedia][SequeLink JDBC Driver]TCP/IP 错误,连接被拒绝
- wordpress - 在 htaccess 中识别 301 重定向的模式
- javascript - 为网络流源/接收器定义逻辑的最佳方法是什么?
- python - 如何防止浮点数在点后删除零?
- python - Python:删除 2 个 csv 文件中的重复元组
- angular - Angular:基于活动路由器链接绑定模板变量的干净方法
- python-3.x - 在 Flask 中执行排序、过滤和分页等操作的简洁方式