我使用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()
希望这能有所帮助!