我正在使用django构建报告门户。在此门户中,我需要让用户能够安排报告在重复的基础上运行。我一直在研究django-celery,并了解你可以使用periodic_task装饰器来安排重复发生的任务,但在所有的例子中,我看到cron调度信息被硬编码到装饰器中。
@periodic_task(run_every=crontab(hours=7, minute=30, day_of_week="mon"))
有没有办法使用django-celery根据用户的输入动态安排重复发生的任务?
例如,用户使用表单选择他们想要运行的报表,提供报表所需的所有参数以及他们希望运行报表的计划。一旦我处理完表单,我可以调用一个方法或函数来将run_report任务添加到日程表中吗?如果有,有办法检索存储在数据库中的所有当前计划,以便显示它们吗?
答案 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