我正在尝试在 celery @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)
我永远无法让调用或运行函数中的打印语句出现在工作程序或调用程序中。
我们如何在不使用基于类的任务定义的情况下装饰 celery 任务(因此装饰器将位于函数定义之上的 @task 之上。
谢谢你的帮助!
米格尔