У меня есть функция задачи сельдерея, которая выглядит как this-Сельдерей функция задачи пользовательских атрибутов
@task(base=MyBaseTask)
@my_custom_decorator
def my_task(*args, **kwargs):
my_task.ltc.some_func() #fails - attribute ltc doesn't exist on the object
и my_custom_decorator выглядит как этот
def my_custom_decorator (f):
from functools import wraps
ltc = SomeClass()
@wraps(f)
def _inner(*args, **kwargs):
ret_obj = None
try:
f.task_cache = ltc
ret_obj = f(*args, **kwargs)
except Exception, e:
raise
return ret_obj
_inner.ltc = ltc
return _inner
я вижу, что это происходит потому, что фактический вызываемый объект, который вызывается для выполнения задачи, является объектом класса задач celery. Как сохранить мой атрибут 'ltc' на этом объекте, чтобы его можно было получить из задачи, как показано выше i.e - my_task.ltc.some_func()
?
Спасибо,
Разве это не означает, что украшенная функция должна принимать ltc в качестве аргумента? – ksrini
Это. И проблем нет. Извините, я не проверял, что именно вы делали. Проблема заключается в том, что при выполнении my_task кода имя my_task указывает на другую функцию, которая является возвращаемой '@ task', и эта функция не имеет атрибута ltc. Вы должны проверить, предоставляет ли '@ task' внутреннюю функцию через некоторый атрибут. – tenuki