Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 芹菜中的延迟回调_Django_Celery_Django Celery - Fatal编程技术网

Django 芹菜中的延迟回调

Django 芹菜中的延迟回调,django,celery,django-celery,Django,Celery,Django Celery,我用的是django芹菜。我需要下载一个大的视频文件。我想在文件下载完成后更新我的数据库。有没有一种方法可以添加一个回调,在任务完成时调用django代码,而不是另一个任务?我的理想代码如下所示 from video.tasks import video_download from video.models import Video def my_callback(v): v.status = "downloaded" v.save() def download_ht

我用的是django芹菜。我需要下载一个大的视频文件。我想在文件下载完成后更新我的数据库。有没有一种方法可以添加一个回调,在任务完成时调用django代码,而不是另一个任务?我的理想代码如下所示

from video.tasks import video_download
from video.models import Video

def my_callback(v):    
    v.status = "downloaded"
    v.save()

def download_http(request):
   v = Video.objects.latest().id #this is a string
   a = video_download.delay(v, my_callback)
如果在芹菜任务完成后有其他方法更新对象,我也会对此感兴趣


PS:我尝试传入
v=Video.objects.latest()
而不是
v=Video.objects.latest().id
,这样我就可以沿途更新实例,但芹菜不喜欢它,因为它是一个对象而不是字符串。尽管它没有抛出任何错误,但每次我调用
a.ready
时,它都返回False。

您可以从任务中调用您的Django代码。例如:

def video_download(v):
     from video.models import Video
     v = Video.objects.get(pk=v)
     do_download(v)
     v.status = "downloaded"
     v.save()

为什么不在任务结束时传递对象id并执行数据库获取和更新?嗨,你能告诉我这是否意味着,在幕后,芹菜只是在django进程中的一个分支,以便执行回调吗?(对于相关的非芹菜情况,了解这一点会有所帮助)。不,本质上没有分叉,您启动一个单独的芹菜工作进程,该进程侦听新任务,并在收到新任务时执行它(例如回调)