2012-04-24 2 views
3

django-celery를 사용하고 있습니다. 큰 비디오 파일을 다운로드해야합니다. 파일 다운로드가 완료되면 데이터베이스를 업데이트하고 싶습니다. django 코드를 호출하는 콜백을 추가하는 방법이 있습니까? 다른 작업이 아니라 작업이 완료되었습니다. 셀러리 작업이 완료된 후, 나는 또한에 관심이있을 것 객체를 업데이트하는 또 다른 방법이 있다면 내 이상적인 코드는 ... 같은Celery에서 지연 콜백

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) 

을 보일 것이다.

추신 : 나는 대신에 v = Video.objects.latest().id을 전달하려고 시도 했으므로 인스턴스를 업데이트 할 수 있었지만 셀러리는 객체가 아니고 문자열이기 때문에 마음에 들지 않았습니다. 오류가 발생하지 않았지만 a.ready을 호출 할 때마다 False가 반환되었습니다.

+1

개체 ID를 전달하지 않고 작업이 끝날 때 데이터베이스를 가져오고 업데이트하지 않는 이유는 무엇입니까? – balsagoth

답변

1

작업에서 장고 코드를 호출 할 수 있습니다. 예 :

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

안녕하세요, 이것은 후드 아래 셀러리가 콜백을 실행하기위한 장고 프로세스의 포크를 만드는 것을 의미하는지 말해 줄 수 있습니까? (관련없는 비 - 셀러리 상황에 대해 이것을 아는 것을 도울 것입니다). –

+0

아니요, 본질적으로 포크는 없습니다. 새 작업을 청취하는 셀러리 작업자 프로세스를 별도로 시작하고 셀러 리 프로세스를 가져 오면 실행합니다 (예 : 콜백). –