Проблема в том, что вы пытаетесь загрузить свои задачи до того, как Django загрузит конфигурацию () с
<b>from app1.models import *</b>
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
app = Celery('projectname')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Конечно, Celery обнаружит задачи в файле celery.py
Помните, что вы импортировали все из celery.py
в __init__.py
, чтобы Django загружал их (Celery stuff, ...) при каждом запуске проекта.
__ init __. py
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ['celery_app']
Итак, в этом случае вы импортируете модели в этот файл celery.py
, скажем, также __init.py__
. Ваши модели будут импортированы до того, как Django загрузит свою конфигурацию, в то время как приложения в вашем settings.py
арене.Пока не построено.
Вы не должны импортировать материалы приложений Django в ваш файл __init__.py
, модули / приложения собираются до того, как Django загрузит конфигурацию (settings.py), это вызовет ошибку Приложенияне загружается , если вы пытаетесь загрузить как models
в __init__.py
файл.
Согласно документации , Celery app.autodiscover_tasks()
способен обнаруживать все найденные задачив любом хорошо зарегистрированном приложении в settings.INSTALLED_APPS
.Вместо импорта задач в celery.py
Просто создайте файл tasks.py
во всех своих приложениях.
| projectname
|____|__init__.py
|____|celery.py # contains app.autodiscover_tasks()
|____|settings.py
|____|urls.py
|____|wsgi.py
|app1
|____|tasks.py
|app2
|____|tasks.py
Задачи могут работать в файле celery.py
, но не при загрузке модели из приложений,используйте вместо этого app.autodiscover_tasks ()
При необходимости используйте также абсолютный импорт из будущего
from __future__ import absolute_import