2015-06-10 3 views
1

Я пытаюсь проверить приложение сельдерей, вот мой кодЗачем добавлять аргументы в Celery, вызывающие ошибку при тестировании в Python?

@celery.task(bind=True, default_retry_delay=30) 
def convert_video(gif_url, webhook): 
    // doing something awesome 
     return 
    except Exception as exc: 
     raise convert_video.retry(exc=exc) 

И в моем тесте я это.

server.convert_video.apply(args=('some_gif', 'http://www.company.com?attachment_id=123')).get() 

После того как я добавил bind=True, default_retry_delay=30 я получаю эту ошибку

TypeError: convert_video() takes exactly 2 arguments (3 given)

+0

Если это должен быть метод, ему необходимо объявить аргумент 'self'. – user2357112

+0

, но если я удалил 'bind = True, default_retry_delay = 30', он отлично работает. – toy

+0

, и если вы удалите 'bind = True' или установите' bind = False', он также будет работать нормально. – Gerrat

ответ

2

Честно говоря, я никогда не использовал сельдерей, но быстрый взгляд на их docs для bind аргумента говорит, что:

The bind argument means that the function will be a “bound method” so that you can access attributes and methods on the task type instance.

Обычно вы использовали бы это только в том случае, если это был метод класса, а не отдельная функция. В качестве метода для класса его первым аргументом будет self.

1

вы используете parmater bind, что означает, что первым параметром, переданным функции, будет экземпляр задачи - он эффективно делает функцию методом класса Task.

@celery.task(bind=True, default_retry_delay=30) 
def convert_video(self, gif_url, webhook): 
    try: 
     log.info('here we have access to task metadata like id: %s', self.request.id) 
     return 
    except Exception as exc: 
     raise convert_video.retry(exc=exc)