Django芹菜和渠道示例

时间:2018-09-27 15:02:20

标签: python django amazon-s3 celery django-channels

我有一个Django应用,需要生成可能需要一分钟的文件,因此我将其传递给后台工作人员。

当前,该过程如下。我发布到服务器,该服务器回复可以轮询的URL。然后,我每2秒轮询一次服务器,然后发回“忙”或该文件在我的S3存储桶中的位置的URL。

我想将此轮询替换为Django渠道,但由于无法在网上找到任何示例,因此不确定实现此目的的最佳方法是什么。频道甚至还打算用于这样的事情吗?

我目前的想法如下:

  1. 客户端在特定路径上打开与该路径的连接后,便开始生成文件(以前这应该是帖子)
  2. 客户端连接后立即启动后台任务,并获得通道名称作为参数
  3. 完成后,它将文件路径发回给使用者,后者又将其发送到浏览器,在这里我将使用JS创建下载按钮。

下面是一个示例:

@shared_task
def my_bg_task(channel_name):
    #some long running calc here
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.send)(channel_name, {'type': 'generation_done', 'f_path': 'path/to/s3/bucket'})


class ReloadConsumer(WebsocketConsumer):
    def connect(self):
        my_bg_task.delay(self.channel_name)
        self.accept()

    def generation_done(self, event):
        self.send(text_data=json.dumps({event}))

这是实现这一目标的最佳方法吗?

很显然,从安全角度出发,打开连接的用户以外的任何人都不能访问它。

0 个答案:

没有答案