Django - 通过事件的 websocket 重复发送 API 调用结果(REST Framework + Channels)

Django - repeatedly send API call result via websocket on events (REST Framework + Channels)

我在将 Django REST Framework 与 Django Channels 集成时遇到问题。

我有一个带有 retrieve (GET) 方法的视图集,它以巧妙的方式从几个不同的模型中准备信息,并将这个“复杂”的结果发送到前端。因此,当客户端向此端点发送带有实体主键的 GET 请求时(如 /complex_entity/1),他会立即收到所需的一切。

现在前端的家伙们想要另一个功能 - 每当一些相关的底层模型发生变化时,后端应该能够将这个复杂请求的结果发送到前端。像这样:浏览器使用主键 1 订阅 ComplexEntity 的更改,并且当 ComplexEntity 1 更改时(或其链接的实体不是问题)服务器发送此复杂请求的结果通过网络套接字。因此请求可以在一个 websocket 连接期间执行多次(在每个模型更改信号上)。

我看到了提供这种行为的两种直观方式:
(?):以某种方式从 django 本身执行对此视图集 retrieve 方法的请求 - 通过在内部调用此方法或通过执行“环回”HTTP 请求。
Bad/ugly:将视图集retrieve方法中的所有复杂逻辑复制到websocket消费者

另外 我发现 Django Channels REST Framework 允许订阅模型实体,但问题是我需要 return 不只是模型实例,还有这个“自定义”结果由多个模型粘合而成。据我了解,DCRF 缺少该功能。

现在我真的不知道什么是解决我的问题的最好方法 - 看起来内部调用方法没问题,但如何去做?
环回 HTTP 请求也可以(我认为)但它应该与站点主机名和理智解开,最好将“发起者”cookie 转发到此类请求以防止对实体的未授权访问。问题又是如何正确地做到这一点。

那么有人知道在一个 websocket 连接期间多次执行相同复杂请求的最佳方法是什么吗?

正确的方法是将通用逻辑移动到可重复使用的方法中,并在 DRF 视图和通道中使用它。

该方法将接收一些参数(我猜是 ComplexEntity 的 ID)并将 return 以您需要的格式生成结果数据。