2011-09-11 126 views
14

我用:Django的芹菜進度條

  1. 芹菜
  2. Django的芹菜
  3. 的RabbitMQ

我可以看到我在Django管理頁面中的所有任務,但此刻它只有幾個州,如:

  • 已收到
  • 重試
  • 撤銷的
  • 成功
  • 已啓動
  • 故障
  • PENDING

它沒有足夠的信息對我來說。是否可以向管理頁面添加有關正在運行的進程的更多詳細信息?像進度條結束作業對抗

我知道如何使用芹菜記錄功能,但GUI是在我的情況下,因某些原因更好。

那麼,是否可以發送一些跟蹤信息到Django-Celery管理頁面?

回答

8

我開始嘗試自己弄明白這一點。首先按照Celery userguide中的說明完全定義PROGRESS狀態,然後您只需在模板中插入一個js來更新進度條。

28

這是我最小的進度報告Django後端使用您的設置。我仍然是一個Django n00b,這是我第一次搞亂Celery,所以這可能會被優化。

from time import sleep 

from celery import task, current_task 
from celery.result import AsyncResult 

from django.http import HttpResponse, HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.utils import simplejson as json 
from django.conf.urls import patterns, url 


@task() 
def do_work(): 
    """ Get some rest, asynchronously, and update the state all the time """ 
    for i in range(100): 
     sleep(0.1) 
     current_task.update_state(state='PROGRESS', 
      meta={'current': i, 'total': 100}) 


def poll_state(request): 
    """ A view to report the progress to the user """ 
    if 'job' in request.GET: 
     job_id = request.GET['job'] 
    else: 
     return HttpResponse('No job id given.') 

    job = AsyncResult(job_id) 
    data = job.result or job.state 
    return HttpResponse(json.dumps(data), mimetype='application/json') 


def init_work(request): 
    """ A view to start a background job and redirect to the status page """ 
    job = do_work.delay() 
    return HttpResponseRedirect(reverse('poll_state') + '?job=' + job.id) 


urlpatterns = patterns('webapp.modules.asynctasks.progress_bar_demo', 
    url(r'^init_work$', init_work), 
    url(r'^poll_state$', poll_state, name="poll_state"), 
) 
+2

在新版本上,我認爲這個習慣用法是'@task(bind = True)',然後調用'self.update_state'。在性能方面我不確定哪個更好。 – dashesy