我用:
我可以在Django管理页面中看到我的所有任务,但目前它只有几个状态,例如:
这对我来说不够。是否可以向管理页面添加有关正在运行的进程的更多详细信息?像进度条或已完成的作业计数器等
我知道如何使用Celery日志记录功能,但由于某些原因,GUI在我的情况下更好。
那么,是否可以将一些跟踪信息发送到Django-Celery管理页面?
答案 0 :(得分:29)
这是我使用您的设置报告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"),
)
答案 1 :(得分:8)
我开始尝试自己解决这个问题。首先完全按照Celery userguide中的说明定义PROGRESS状态,然后您只需在模板中插入一个更新进度条的js。
答案 2 :(得分:5)
感谢@Florian Sesser为您的榜样!
我制作了一个完整的Django应用程序,显示了为http://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html
用户创建1000个对象的进度每个人都可以下载并使用它!
答案 3 :(得分:1)
为此,我建议使用一个名为celery-progress的库。它的设计目的是尽可能简单地将基本的端到端进度条设置放入具有尽可能少的脚手架的django应用中,同时如果需要的话还支持前端的大量自定义。有关自述文件入门的大量文档和参考。
完全公开:我是所述图书馆的作者/维护者。