Django-Celery进度条

der*_*evo 18 django django-celery

我用:

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

我可以在Django管理页面中看到我的所有任务,但目前它只有几个状态,例如:

  • RECEIVED
  • 重试
  • 撤销的
  • 成功
  • 已启动
  • 失败
  • PENDING

这对我来说还不够.是否可以向管理页面添加有关正在运行的进程的更多详细信息?像进度条完成的工作柜台

我知道如何使用Celery日志记录功能,但出于某些原因,GUI在我的情况下更好.

那么,是否可以将一些跟踪信息发送到Django-Celery管理页面?

Flo*_*ser 30

这是我的最小进度报告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"),
)
Run Code Online (Sandbox Code Playgroud)

  • 在较新的版本中,我认为成语是`@task(bind = True)`然后调用`self.update_state`.性能方面我不确定哪个更好. (3认同)

Mar*_*ius 8

我开始尝试自己解决这个问题.首先完全按照Celery用户指南中的说明定义PROGRESS状态,然后您只需在模板中插入一个更新进度条的js.


Cor*_*ory 6

我会为此推荐一个名为celery-progress的库。它旨在尽可能轻松地将基本的端到端进度条设置放入尽可能少的脚手架的 django 应用程序中,同时如果需要,还支持前端的大量定制。README 中有大量文档和参考资料,可用于入门。

完全披露:我是该库的作者/维护者。


Tri*_*yen 5

感谢@Florian Sesser为您的榜样!

我做了一个完整的Django应用程序,显示的进度在创建1000个对象给用户http://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html

每个人都可以下载并使用它!