根据用户输入使用django-celery安排任务

时间:2011-12-08 21:05:06

标签: django user-input celery django-celery

我正在使用django构建报告门户。在此门户中,我需要让用户能够安排报告在重复的基础上运行。我一直在研究django-celery,并了解你可以使用periodic_task装饰器来安排重复发生的任务,但在所有的例子中,我看到cron调度信息被硬编码到装饰器中。

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

有没有办法使用django-celery根据用户的输入动态安排重复发生的任务?

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

3 个答案:

答案 0 :(得分:1)

看一下admin-interface中的djcelery: http://localhost:8000/admin/djcelery/

尝试在那里构建所需的任务设置(使用crontabs / interval / periodic task) 如果是的话,很有可能你可以快速建立起来......

答案 1 :(得分: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秒,使用eta

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

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

答案 2 :(得分: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