9

セロリ @task デコレータの後にデコレータを適用しようとしています。

@send_email
@task
def any_function():

   print "inside the function"

ドキュメントで推奨されている方法で動作させることができます。つまり、タスク デコレーターの前にデコレーターを配置しますが、この場合、デコレーターでタスク インスタンスにアクセスしたいと考えています。

@send_email はクラスデコレータでなければなりません。これは私が試したものですが、成功しませんでした:

class send_email(object):
    ''' wraps a Task celery class '''
    def __init__(self, obj):

        self.wrapped_obj = obj

        functools.update_wrapper(self, obj)

    def __call__(self, *args, **kwargs):

        print "call"

        return self.wrapped_obj.__call__(*args, **kwargs)

    def run(self, *args, **kwargs):

        print "run"

        return self.wrapped_obj.__call__(*args, **kwargs)

    def __getattr__(self, attr):

        if attr in self.__dict__:

            return getattr(self, attr)

        return getattr(self.wrapped_obj, attr)

callまたは run 関数内の print ステートメントをワーカーまたは呼び出し元に表示することはできません。

クラスベースのタスク定義に頼らずに、セロリのタスクをどのようにデコレートできますか (そのため、デコレータは関数定義の上の @task の上にあります。

助けてくれてありがとう!

ミゲル

4

2 に答える 2

5

「前」は視覚的に「後」のように見えます。

例えば、これ:

@decorator1
@decorator2
@decorator3
def func():
  pass

次と同等です。

def func():
  pass

func = decorator1(decorator2(decorator3(func)))

これは、前に適用するには@send_email後で書く必要があることを意味します。例えば:@task@task

@task
@send_email
def any_function():
    print "inside the function"
于 2013-10-16T09:06:37.460 に答える