I am trying to apply a decorator after the celery @task decorator, something like.
@send_email @task def any_function(): print "inside the function"
I can make it work as recommended in documents, i.e. put the decorator in front of the task decorator, but in this case I would like to access the instance of the task in my decorator.
@send_email should be a class decorator, here is what I tried without success:
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)
I can never get a print statement in a call or run a function of a function to display in the work or caller.
How can we decorate a celery task without resorting to class-based task definitions (so the decorator will be higher than @task over the function definition.
Thanks for any help!
Miguel
source share