将 Django 模型的保存方法与芹菜挂钩



我使用S3作为Django中的媒体存储。问题是,如果上传视频,在视图中返回响应的时间太长。我知道应该有一种方法使它异步。

view.py的片段

with transaction.atomic():
    media = Media(
        med_user_id=account,
        med_path=file,
        med_thumbnail=thumbnail,
        med_assoc_data=data,
    )
   save_async.delay(media)

变量文件是具有此类<class 'django.core.files.uploadedfile.TemporaryUploadedFile'> 的视频

当我通过media.save()保存时,需要12-20秒才能完成。我想创建一个可以处理它的芹菜任务。

@app.task(bind=True)
def save_async(self, instance):
    instance.save()

我知道这没有任何意义,因为它抛出了一个序列化错误。Object of type Media is not JSON serializable那么问题来了,我应该如何使model.save()函数与芹菜异步?

提前谢谢。

Celery不理解这样的对象。最好的解决方案是将对象属性发送到save_async。是的,您将失去延迟保存方法的通用性。因此,在这种情况下,您需要在数据库中保存一个引用,并将带有数据的属性发送到延迟方法。上面的例子是这样的,

视图.py

with transaction.atomic():
    media = Media(
       med_user_id=account,
       med_path=file,
       med_thumbnail=thumbnail,
       med_assoc_data=None,    # you can remove this or add a reference to ur S3 upload ID
   )
media.save()
save_async.delay(media.id, data)

在tasks.py文件中

@app.task(bind=True)
def save_async(instance_id, data):
    media = Media.objects.get(pk=instance_id)
    media.data = data
    media.save()

希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新