2013-01-02 26 views
10

django-celeryを使用して任意のタスクの遅延を追加したいと考えています。現在、私は次のようなクラスを作成している(単なる一例を、実際のクラスはこれ以上のものを持っている):次のようにdjango-celery:動的にタスクを作成して登録する

from celery.task import task 

class Delayer(object): 
    def delay(self, func, minutes): 
     return task(func, name="%s.delayed"%self.__class__.__name__)\ 
      .apply_async(countdown=minutes*60) 

私はcelerydを実行しているよ:

python manage.py celeryd -E -B -lDEBUG 

私がしようとするとDjangoのシェル内から私の遅延方法を実行している[例えばDelayer().delay(lambda: 1, 1)]、私は私のceleryd出力にこのようなエラーを取得しています:

[2013-01-02 15:26:39,324: ERROR/MainProcess] Received unregistered task of type "Delayer.delayed". 
The message has been ignored and discarded. 

Did you remember to import the module containing this task? 
Or maybe you are using relative imports? 
Please see http://bit.ly/gLye1c for more information. 

The full contents of the message body was: 
{'retries': 0, 'task': "Delayer.delayed", 'eta': '2013-01-02T21:27:39.320913', 'args': [], 'expires': None, 'callbacks': None, 'errbacks': None, 'kwargs': {}, 'id': '99d49fa7-bd4b-40b0-80dc-57309a6f19b1', 'utc': True} (229b) 

Traceback (most recent call last): 
    File "/home/simon/websites/envs/delayer/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 432, in on_task_received 
    strategies[name](message, body, message.ack_log_error) 
KeyError: "Delayer.delayed" 

私の質問は、そのような動的creatの登録が可能ですエドタスク?そうでない場合は、セロリを使用して同じ効果を達成するために他にどのような方法を使用できますか?

答えて

10

簡単な答えはできません。セロリは別のプロセスで実行されているため、セロリタスクとして実行されるコードをインポートできる必要があります。あなたの生成された呼び出し可能性はありません。したがって、callableへの参照を移動するセロリの方法は機能しません。

しかし、これは攻撃の可能な方法を示唆しています。呼び出し可能な関数をシリアライズする別の方法を考え出すことができれば、それを単純なセロリタスクの引数として指定できます。 This previous questionが役に立ちます。セキュリティの注意点に注意してください:-)

関連する問題