【问题标题】:Hooking Django model intstance's save method to celery将 Django 模型实例的保存方法挂接到 celery
【发布时间】:2020-06-19 05:15:20
【问题描述】:

我在 Django 中使用 S3 作为媒体存储。问题是,如果上传视频,则在视图中返回响应需要很长时间。我知道应该有办法让它异步。

view.py

sn-p

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 异步?

提前谢谢你。

【问题讨论】:

    标签: python django python-3.x amazon-s3 celery


    【解决方案1】:

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

    在views.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()
    

    希望这会有所帮助!

    【讨论】:

    • 变量文件是里面的主要人物。那就是上传视频的地方。问题是它不能通过.delay()方法传递,因为它不是`JSON可序列化`
    • 同一个概念。无论有没有文件,您都不能将 django 对象传递给工作人员。保存没有大文件的对象,然后将其 id 与大数据一起发送给 worker。
    • 您不能将对象作为参数传递,无论模型是否保存都无关紧要。我仍然得到同样的错误Object of type TemporaryUploadedFile is not JSON serializable@devdob
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2015-02-27
    • 2014-03-20
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多