Django + Celery: ImportError: нет модуля с именем project.urls

Когда я запускаю воркера, использующего Django и Celery, используя эту команду (я выполняю команду в каталоге d):

celery -A e.project.celery:app worker -l info

File "/Users/.../..../e/venv/lib/python2.7/site-packages/celery-4.2.0-py2.7.egg/celery/loaders/base.py", line 108, in import_default_modules
    raise response

ImportError: No module named project.urls

Я использую Django 1.11 и Celery 4.2 с Python 2.7.

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

Структура Django:

d/
    __init__.py
    e/
        __init__.py
        core/
            __init__.py
            app1/
                 __init__.py
                 tasks.py
        project/ (project stuff)
            __init__.py
            celery.py
            settings.py
            urls.py
            context_processors.py
            wsgi.py
    manage.py
    setup.py

settings.py:

INSTALLED_APPS = [
'...',
'django_celery_results',
'django_celery_beat'
]


CELERY_RESULT_BACKEND = 'django-db'
CELERY_BROKER_URL = 'redis://foo:[email protected]:6599/1'
CELERY_CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

e/project/__init__.py:

from __future__ import absolute_import, unicode_literals

from e.project.celery import app as celery_app

__all__ = ('celery_app', )

e/project/celery.py:

from __future__ import absolute_import, unicode_literals
import os
import sys
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "e.project.settings")

app = Celery('e_tasks')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

if __name__ == '__main__':
    app.start()

d/e/core/app1/tasks.py:

from celery import shared_task


@shared_task
def hello_world_task():
    print('Hello world')

Мой файл manage.py:

#!/usr/local/bin/python2.7

import os
import sys

if __name__ == "__main__":
    sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'e'))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "e.project.settings")

try:
    from django.core.management import execute_from_command_line
except ImportError:
    # The above import may fail for some other reason. Ensure that the
    # issue is really that Django is missing to avoid masking other
    # exceptions on Python 2.
    try:
        import django
    except ImportError:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        )
    raise
execute_from_command_line(sys.argv)

INSTALLED_APPS содержит 'project'?

Willem Van Onsem 13.06.2018 23:30

Нет, я никогда не помещал project в INSTALLED_APPS. Все мое приложение Django отлично работает без него. Зачем мне это туда ставить? Возможно, я сделаю другой каталог для истории celery.py, если это так.

AAA 13.06.2018 23:33

@AAA у вас странная структура проекта. У вас есть настройки в manage.py? '...' в INSTALLED_APPS - это ваш настоящий код или вы просто сократили его перед вставкой сюда?

Alex Yu 14.06.2018 02:46
... - это аббревиатура перед вставкой сюда. Я скопирую и вставлю свой файл manage.py в OP.
AAA 14.06.2018 02:47

Я только что вставил свой файл manage.py. Может быть, это деталь os.path.append?

AAA 14.06.2018 02:49

Попробуйте PYTHONPATH=$PWD/e celery -A e.project.celery:app worker -l info

Tarun Lalwani 20.06.2018 11:26

Я вижу, что вы используете e.project.celery и e.project.settings, но ошибка говорит о том, что не удается найти project.urls (в начале нет e.). Как вы определили настройку ROOT_URLCONF?

Ralf 23.06.2018 13:43

@Ralf Это действительно была проблема, ой! Если вы ответите на вопрос, я приму ваш ответ и награду вас наградой. Спасибо!

AAA 25.06.2018 03:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
8
1 305
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в комментариях к вопросу, я вижу, что вы используете e.project.celery и e.project.settings в своих операторах импорта, но ошибка говорит о том, что не удается найти project.urls (в начале нет e.).

Как вы определили настройку ROOT_URLCONF? Может быть, в этом проблема.

Другие вопросы по теме