2011-12-08 10 views
8

Estoy construyendo un portal de información usando Django. En este portal, debo brindarles a los usuarios la posibilidad de programar informes para que se ejecuten de forma recurrente. He estado investigando django-apio y entiendo que puede usar el decorador periódicos_tareas para programar una tarea recurrente, pero en todos los ejemplos que he visto, la información del cronograma cron está codificada en el decorador.Programar tareas utilizando Django-apio basado en la entrada del usuario

@periodic_task(run_every=crontab(hours=7, minute=30, day_of_week="mon")) 

¿Hay alguna manera usando Django-apio para programar una tarea que ocurre de nuevo dinámicamente basándose en la entrada de un usuario?

Por ejemplo, un usuario utiliza un formulario para seleccionar el informe que quiere ejecutar, proporcionar todos los parámetros requeridos por el informe y el horario cuando quieren el informe se ejecuta en. Una vez que he procesado el formulario, ¿hay algún método o función al que pueda llamar para agregar una tarea run_report a un cronograma? De ser así, ¿hay alguna manera de recuperar todas las programaciones actuales almacenadas en la base de datos para que puedan visualizarse?

+0

alternativamente, puede programar una única tarea que a su vez planifica la siguiente, y así sucesivamente ... – DanJ

+0

¿Qué ocurre si se crea una función interna y se aplica el decorador '@ periodic_task' con un objeto' crontab' creado dinámicamente? Tengo el mismo problema, ¿quizás esto podría ayudar? –

+0

Tengo exactamente el mismo problema. ¿Alguna información sobre cómo lo resolvió? – Jannis

Respuesta

1

Tak un vistazo a djcelery en el admin-interfaz: http://localhost:8000/admin/djcelery/

Pruebe si se puede construir la tarea-configuración necesaria allí (usando crontabs/intervalos/tareas periódicas) Si es así hay una gran posibilidad de que se puede construir este rápidamente ..

0

anular su método para guardar en los modelos. Siempre que el usuario ingrese "Me gusta" para comenzar un proceso/tarea, modificará el modelo que activa la tarea para comenzar.

your_app/models.py:

class My_Model(models.Model): 
customer = models.ForeignKey(User, related_name='original_customer_id') 
start_task = models.BooleanField(default=False, blank=True) 

def save(self, *args, **kwargs): 
    super(NewProject, self).save(*args, **kwargs) 
    from .tasks import my_task 
    my_task.apply_async(args=[self.pk, self.status, self.file_type],) 

your_app/tasks.py

@celery.task() 
def my_task(foo, bar): 
    #do something 
1

http://celery.readthedocs.org/en/latest/userguide/calling.html

por ejemplo: -

from celery import task 

@task.task(ignore_result=True) 
def T(message=None): 
    print message 

.

T.apply_async(countdown=10, message="hi") 

se ejecuta dentro de 10 segundos.

T.apply_async(eta=now + timedelta(seconds=10),message="hi") 

ejecuta 10 segundos a partir de ahora, specifed usando eta

T.apply_async(countdown=60, expires=120,message="hi") 

ejecuta en un minuto a partir de ahora, pero expira después de 2 minutos.

Cuestiones relacionadas