Планирование задач с использованием django-сельдерея на основе пользовательского ввода - PullRequest
8 голосов
/ 09 декабря 2011

Я создаю портал отчетности с использованием django. На этом портале мне нужно дать пользователям возможность планировать отчеты для регулярного запуска. Я изучал django-celery и понимаю, что вы можете использовать декоратор period_task для планирования повторяющейся задачи, но во всех примерах, которые я видел, информация о расписании cron жестко запрограммирована в декораторе.

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

Есть ли способ использования django-celery для динамического планирования повторяющейся задачи на основе ввода от пользователя?

Например, пользователь использует форму, чтобы выбрать отчет, который он хочет запустить, предоставить все параметры, необходимые для отчета, и расписание, когда он хочет, чтобы отчет был запущен. После того, как я обработал форму, есть ли метод или функция, которую я могу вызвать, чтобы добавить задачу run_report в расписание? Если да, есть ли способ получить все текущие расписания, хранящиеся в базе данных, чтобы их можно было отобразить?

Ответы [ 3 ]

1 голос
/ 17 сентября 2014

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 минуты.

1 голос
/ 14 февраля 2012

Взгляните на djcelery в административном интерфейсе: http://localhost:8000/admin/djcelery/

Попробуйте, если вы можете построить там необходимые настройки задач (используя crontabs / интервалы / периодические задачи) Если да, есть большой шансчто вы можете создать это быстро ..

0 голосов
/ 30 августа 2014

Переопределите ваш метод сохранения в моделях. Всякий раз, когда пользователь вводит лайки для запуска процесса / задачи, он изменяет модель, которая запускает задачу.

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
...