2011-12-08 17 views
8

djangoを使用してレポートポータルを構築しています。このポータルでは、ユーザーに、レポートを再帰的に実行するようにスケジュールする機能を提供する必要があります。私はdjango-cellelを研究しており、periodic_taskデコレータを使って再帰的なタスクをスケジューリングできることを理解していますが、cronのスケジュール情報がすべてデコレータにハードコードされているのを見てきました。ユーザー入力に基づいてdjango-celeryを使用してタスクをスケジュールする

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

動的にユーザからの入力に基づいて再発タスクをスケジュールするジャンゴ・セロリを使っ方法はありますか?

たとえば、ユーザーはフォームを使用して実行するレポートを選択し、レポートで必要なすべてのパラメータとレポートを実行するスケジュールを指定します。フォームを処理したら、run_reportタスクをスケジュールに追加するために呼び出せるメソッドまたは関数がありますか?もしそうなら、データベースに保存されているすべての現在のスケジュールを取得して表示できるようにする方法がありますか?

+0

代わりに、次のタスクをスケジュールするタスクをスケジュールすることができます。 – DanJ

+0

内部関数が作成され、動的に作成された 'crontab'オブジェクトで' @ periodic_task'デコレータを適用するとどうなりますか?私は同じ問題を抱えています。多分これが助けになるでしょうか? –

+0

私はまったく同じ問題を抱えています。どのようにあなたがそれを解決したかについての情報はありますか? – Jannis

答えて

1

タク管理インターフェイスでdjceleryを見て: http://localhost:8000/admin/djcelery/

あなたがそこに必要なタスクのセットアップを構築することができた場合(crontabファイル/間隔/定期的なタスクを使用して) を試してみてくださいはい、大きなチャンスがある場合は、そのこれをすぐに構築することができます。

0

モデルで保存メソッドを上書きします。ユーザーがプロセス/タスクを開始するように好きなことを入力すると、タスクを開始するモデルを変更します。

your_app/models.py:tasks.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/

@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秒を実行し、

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

は、今から1分で実行ETAを使用してspecifedが、2分後に期限が切れます。

関連する問題