Сельдерей: автоматическое обнаружение не находит модуль задач в приложении

У меня есть следующая установка со свежим установленным сельдереем и django 1.4:

Settings.py:

<code>import djcelery
djcelery.setup_loader()

BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'user'
BROKER_PASSWORD = 'password'
BROKER_VHOST = 'test'

[...]

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'djcelery',
    'south',
    'compressor',
    'testapp',
]
</code>

TestApp / tasks.py:

<code>from celery.task import task

@task()
def add(x, y):
    return x + y
</code>

Доставка сообщений на celeryd работает нормально, но задача всегда незарегистрированная (поэтому автоматическое обнаружение здесь не работает должным образом). Только если я импортирую модуль задач вtasks/__init__.py задание найдено, и я могу его использовать.

Также документация немного запутала насчет импорта декоратора, но я думаю, что сейчас это правильно.

Где ошибка в моей настройке?

Ответы на вопрос(5)

и я исправил ее, назвав задачу.

@task () - & gt; @task (имя = & APOS; testapp.tasks.add & APOS;)

 29 янв. 2013 г., 02:55
Кажется, он не работает с приведенным выше предложением.
 03 сент. 2012 г., 02:53
Вы делали какие-либо другие изменения? У меня та же проблема, но простое добавление имени, похоже, не решает ее
 11 сент. 2012 г., 17:31
Мне нужно было перезапустить клиента сельдерея. Но я не делал никаких других изменений.

что вам нужно импортировать «экземпляр приложения Celery» и объявить задачу следующим образом:

from project_name.celery import app

@app.task
def video_process_task(video_id):
    pass

обратите внимание, что в папке project_dir / project_name есть файл celery.py, который объявляет экземпляр celery, например так:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
app = Celery('project_n,ame')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

как указано вофициальная документация.

Кроме того, вы должны зарегистрировать задачу одним из следующих трех способов:

the CELERY_IMPORTS variable in Django project's settings.py file as in dgel's answer passing bind=True to the decorator like: @app.task(bind=True) if you set autodiscovery for celery like it is done above in the line app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , each Django application's folder can contain a tasks.py file, and the tasks declared inside it will be automatically registered

обратите внимание, что изменения в задачах ТРЕБУЮТ РЕСТАРТА CELERY для вступления в силу

 05 мар. 2018 г., 08:20
перезагрузка сельдерея не работает для меня, мне нужно удалитьpycache папка чтобы сделать автоматическое обнаружение задачи в файлах tasks.py ... в чем здесь проблема ??
 07 дек. 2018 г., 18:20
Я думаю, вам нужно вручную импортировать ваши задачи вsettings.py, Я на окнах и моя версия сельдерея 3.1.25. Я решаю проблему с ручным импортом

В моем случае это было переключение со старых модульных базINSTALLED_APPS установка на новыйAppConfig на основе конфигурации.

New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.

Чтобы это исправить, вы должны изменить способ подачи пакетов на сельдерей, как указано здесь в2248 Выпуск сельдерея:

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()]

Вместостарый сельдерей 3 пути:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
 27 дек. 2018 г., 02:42
да, например, если я укажу «blog.apps.BlogConfig» в моем INSTALLED_APPS & lt; сельдерее не могу этого найти. Я должен поставить "блог" в INSTALLED_APPS, что сельдерей может найти
 18 апр. 2017 г., 17:11
И обратите внимание, что если вы используете Celery 4, ошибка была исправлена -github.com/celery/celery/issues/3341-- и вы можете сделатьapp.autodiscover_tasks()
Решение Вопроса

пожалуйста, обновитесь до 2.5.5!

 Martin21 апр. 2012 г., 18:06
Да, это сработало :)
 Martin20 апр. 2012 г., 10:13
Я собираюсь проверить это позже, но, как я вижу на Pypi, 2.5.5 был выпущен вчера, так что это действительно хорошая информация!

добавлятьCELERY_IMPORTS в ваши settings.py:

CELERY_IMPORTS = ('testapp.tasks',)

Импортировать все задачи вtestapp.tasks.__init__ файл

затемCelery импортирует все задачи из папки testapp.tasks и назовет их такими, какие они есть

 23 июл. 2017 г., 16:43
Это работает для меня, большое спасибо.
 Martin20 апр. 2012 г., 10:12
Я проверял это, но это не помогло. Только импорт в__init__.py приложения получили задачу, работающую.
 31 мая 2012 г., 12:29
Была такая же проблема с 2.5.5. Добавление CELERY_IMPORTS у меня сработало, но только вместе с явным аргументом имени в декораторе. Простое использование @task () вызывает ошибку KeyError.

Ваш ответ на вопрос