Python Django-在事件(REST框架和通道)上通过websocket重复发送API调用结果

Python Django-在事件(REST框架和通道)上通过websocket重复发送API调用结果,python,django,websocket,django-rest-framework,django-channels,Python,Django,Websocket,Django Rest Framework,Django Channels,我在将Django REST框架与Django通道集成时遇到了一个问题 我有一个带有retrieve(GET)方法的viewset,它以巧妙的方式准备来自多个不同模型的信息,并将这个“复杂”的结果发送到前端。因此,当客户机将带有实体主键的GET请求发送到此端点时(如/complex\u entity/1),他会立即收到所需的一切 现在,前端的家伙们想拥有另一项功能——后端应该能够在每次相关底层模型发生更改时将这个复杂请求的结果发送到前端。如下所示:浏览器使用主键1订阅ComplexEntity的

我在将Django REST框架与Django通道集成时遇到了一个问题

我有一个带有
retrieve
(GET)方法的viewset,它以巧妙的方式准备来自多个不同模型的信息,并将这个“复杂”的结果发送到前端。因此,当客户机将带有实体主键的GET请求发送到此端点时(如
/complex\u entity/1
),他会立即收到所需的一切

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

我认为有两种直观的方法可以提供这种行为:
Good(?):通过内部调用此方法或执行“环回”HTTP请求,以某种方式从django本身执行对此viewset
retrieve
方法的请求。
错误/丑陋:将viewset
检索
方法中的所有复杂逻辑复制到websocket使用者

另外我找到了允许订阅模型实体的方法,但问题是我不仅需要返回模型实例,还需要返回粘在几个模型上的“自定义”结果。据我所知,DCRF缺少该功能

目前我还不知道解决问题的最佳方法是什么——看起来内部调用方法是可以的,但如何做呢?
环回HTTP请求也可以(我认为),但它应该与站点主机名分离,sanity表示,最好将“发起人”cookie转发给此类请求,以防止未经授权访问实体。问题是,如何正确地做


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

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


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

谢谢您的好主意!我甚至没有想过将任何代码移动到“共享”文件中,因为我真的习惯于认为Django中的任何代码都有一个众所周知的特定文件,除了它是一个不优雅的垃圾:)