Python Django芹菜和通道示例

Python Django芹菜和通道示例,python,django,amazon-s3,celery,django-channels,Python,Django,Amazon S3,Celery,Django Channels,我有一个Django应用程序,需要生成最多需要一分钟的文件,所以我将其传递给后台工作人员 目前,流程如下所示。我发布到服务器,该服务器使用我可以轮询的URL进行回复。然后,我每2秒轮询一次服务器,并返回“busy”或文件在我的S3存储桶中的位置的url 我想用Django频道取代这种轮询,但不确定实现这一点的最佳方式是什么,因为我在网上找不到任何示例。这些频道是不是专门为这样的东西设计的 我目前的想法如下: 一旦客户端在特定路由上打开与的连接,就开始生成文件(以前这是post) 客户端连接并获取

我有一个Django应用程序,需要生成最多需要一分钟的文件,所以我将其传递给后台工作人员

目前,流程如下所示。我发布到服务器,该服务器使用我可以轮询的URL进行回复。然后,我每2秒轮询一次服务器,并返回“busy”或文件在我的S3存储桶中的位置的url

我想用Django频道取代这种轮询,但不确定实现这一点的最佳方式是什么,因为我在网上找不到任何示例。这些频道是不是专门为这样的东西设计的

我目前的想法如下:

  • 一旦客户端在特定路由上打开与的连接,就开始生成文件(以前这是post)
  • 客户端连接并获取通道名称作为参数后,后台任务立即启动
  • 完成后,它会将文件路径发送回消费者,消费者会将文件路径发送到浏览器,我将使用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}))
    
    这是实现这一目标的最佳方式吗?


    显然,从安全的角度来看,除了打开连接的用户之外,任何人都不应该访问它。

    您能分享整个代码吗?这将是我的救命稻草。谢谢