2011-09-11 86 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