2011-12-08 2 views
8

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

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

Есть ли способ, с помощью Джанго-сельдерей, чтобы запланировать задачу динамически повторяющуюся на основе входных данных от пользователя?

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

+0

В качестве альтернативы вы можете запланировать одну задачу, которая, в свою очередь, планирует следующий, и так далее ... – DanJ

+0

Что делать, если внутренняя функция создана и применяется декоратором '@ period_task' с динамически созданным объектом' crontab'? У меня такая же проблема, может быть, это поможет? –

+0

У меня такая же проблема. Любая информация о том, как вы ее решили? – Jannis

ответ

1

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

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

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 секунд с этого момента, используя ETA предписанных в технических заданиях

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

выполняет в течение одной минуты с этого момента, но истекает через 2 минуты.

Смежные вопросы