Приложения еще не загружены при попытке импортировать модель в файле задач сельдерея - PullRequest
0 голосов
/ 04 июня 2018

Перед любыми объяснениями вот дерево моего проекта

| projectname
|____|__init__.py
|____|celery.py
|____|settings.py
|____|urls.py
|____|wsgi.py
|app1
|app2

Вот мой celery.py

from celery import Celery
from celery import shared_task

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
app = Celery('projectname')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

from app1.models import *

@share_task
def tasks():
     ''' '''

Каждый раз, когда я пытаюсь импортировать models в celery.pyфайл с этой строкой from app1.models import * Я получил:

django.core.exceptions.AppRegistryNotReady: приложения еще не загружены.

И локальный сервер перестает работать всенеожиданно Этот пост связан с похожей проблемой, но не уверен, что это так.

Мне нужно импортировать некоторые модели в файл, чтобы я мог использовать их длянекоторые запросы.

Я получил небольшую подсказку о том, что может быть не так, но не уверен.

views импортировать вещи из models.py
views импортировать материал из celery.py, например, задачу для выполнения
celery.py пытается импортировать материалс models.

Так что этот круг, как змея, которая кусает свой хвост, странен для меня.

1 Ответ

0 голосов
/ 04 июня 2018

Проблема в том, что вы пытаетесь загрузить свои задачи до того, как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...