Django-Celery progress bar

前端 未结 4 1431
闹比i
闹比i 2020-12-07 23:17

I use:

  1. Celery
  2. Django-Celery
  3. RabbitMQ

I can see all my tasks in the Django admin page, but at the moment it has just a few st

相关标签:
4条回答
  • 2020-12-07 23:51

    I am starting to try figuring this out myself. Start by defining a PROGRESS state exactly as explained on the Celery userguide, then all you need is to insert a js in your template that will update your progress bar.

    0 讨论(0)
  • 2020-12-07 23:52

    Here's my minimal progress-reporting Django backend using your setup. I'm still a Django n00b and it's the first time I'm messing with Celery, so this can probably be optimized.

    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"),
    )
    
    0 讨论(0)
  • 2020-12-07 23:53

    I would recommend a library called celery-progress for this. It is designed to make it as easy as possible to drop-in a basic end-to-end progress bar setup into a django app with as little scaffolding as possible, while also supporting heavy customization on the front-end if desired. Lots of docs and references for getting started in the README.

    Full disclosure: I am the author/maintainer of said library.

    0 讨论(0)
  • 2020-12-08 00:03

    Thank @Florian Sesser for your example!

    I made a complete Django app that show the progress of create 1000 objects to the users at http://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html

    Everyone can download and use it!

    0 讨论(0)
提交回复
热议问题