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

2024-09-30 00:36:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

另外我发现Django Channels REST Framework允许订阅模型实体,但问题是我不仅需要返回模型实例,还需要返回粘在几个模型上的这个“自定义”结果。据我所知,DCRF缺少该功能

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

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


Tags: django方法模型功能实体框架resthttp
1条回答
网友
1楼 · 发布于 2024-09-30 00:36:00

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

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

相关问题 更多 >

    热门问题