2011-09-11 29 views
14

utilizo:Django-apio barra de progreso

  1. apio
  2. Django-apio
  3. RabbitMQ

puedo ver todas mis tareas en la página de administración de Django, pero por el momento tiene solo algunos estados, como:

  • RECIBIDO
  • REINTENTO
  • REVOCADO
  • ÉXITO
  • EMPEZAR
  • FALLO
  • PENDIENTE

No es suficiente información para mí. ¿Es posible agregar más detalles sobre un proceso en ejecución a la página de administración? Al igual que la barra de progreso o trabajos terminados contrarrestar etc.

Sé cómo utilizar la función de registro de apio, pero una GUI es mejor en mi caso por algunas razones.

Entonces, ¿es posible enviar información de rastreo a la página de administración de Django-Apio?

Respuesta

8

Estoy empezando a tratar de resolver esto por mi cuenta. Comience definiendo un estado PROGRESO exactamente como se explica en el Celery userguide, entonces todo lo que necesita es insertar un js en su plantilla que actualizará su barra de progreso.

28

Aquí está mi back-end Django de informes de progreso mínimos usando su configuración. Sigo siendo un Django n00b y es la primera vez que estoy jugando con Apio, por lo que probablemente se pueda optimizar.

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

En las versiones más nuevas, creo que la expresión idiomática es '@task (bind = True)' y luego llamar 'self.update_state'. En cuanto a rendimiento, no estoy seguro de cuál es mejor. – dashesy

5

¡Gracias @Florian Sesser por su ejemplo!

me hizo una completa aplicación de Django que muestran el progreso de crear objetos a los 1000 usuarios en http://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html

Todo el mundo puede descargar y usar!

+1

Gracias por el blog, pero el código ya no está disponible. – Demonedge

+0

Aquí está la carpeta del proyecto: https://www.dropbox.com/sh/o9p92yxhpdx58yh/AABBpO912y3NKgXXU4QeLHAFa?dl=0 –