2011-12-08 34 views
8

我正在使用django构建一个报告门户。在此门户网站中,我需要让用户能够安排报告在重复发生的基础上运行。我一直在研究django-celery,并明白你可以使用periodic_task修饰器来安排一个重复的任务,但在所有的例子中,我看到cron的日程表信息被硬编码到修饰器中。根据用户输入使用django-celery安排任务

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

有没有一种方法可以使用django-celery根据用户的输入动态地安排一个重复的任务?

例如,用户使用表单来选择他们想要运行的报表,提供报表所需的所有参数以及他们希望报表运行时的计划。一旦我处理完了表单,我可以调用哪个方法或函数来将run_report任务添加到计划中?如果有,是否有办法检索存储在数据库中的所有当前日程表以便显示它们?

+0

或者,您可以安排一个任务,然后调度下一个任务,依此类推...... – DanJ

+0

如果创建一个内部函数并将'@ periodic_task'装饰器与动态创建的'crontab'对象一起应用,会怎么样?我有同样的问题,也许这会有所帮助? –

+0

我有完全相同的问题。任何有关你如何解决它的信息? – Jannis

回答

1

德一起来看看在管理界面djcelery: http://localhost:8000/admin/djcelery/

尝试,如果你能建立所需的任务,设置有(使用的crontab /间隔/周期性任务) 如果是有一个很大的机会,你可以快速建立起来。

0

覆盖模型中的保存方法。每当用户输入喜欢启动进程/任务时,他都会修改触发任务启动的模型。

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

例如: -

from celery import task 

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

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

从现在开始执行10秒。

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

从现在执行10秒,使用specifed ETA

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

在一分钟内执行从现在,但2分钟后过期。