Нет модуля с именем 'project_name' в Django + Celery?

День 2 отладки этого Я должен обратиться к stackoverflow Я на краю.

Я использовал cookiecutter-django для генерации своего проекта несколько месяцев назад.

Project name
     config/settings/...
     src/
        app_name/
            __init__.py
     manage.py

когда я создаю celery.py внутри config, я получаю ошибку, потому что он назван в честь пакета, поэтому я погуглил и попробовал использовать absolute_import, но я просто назвал файл celery_app.py, как сделали ребята из django-cookie-cutter

celery_app.py

import os

from celery import Celery

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

app = Celery("my_awesome_project") #I tried this with 10 different names, doesn't make any difference

# 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()

init.py внутри config/

#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_app import app as celery_app

__all__ = ('celery_app',)

последние строки трассировки

  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named '<project_name>'

Была ошибка с python 3.7 и celery, когда нужно было понизить версию importlib-metadata с pip3 install importlib-metadata==4.13.0 Я использую python 3.9.6 и пробовал как понижение, так и установку последней версии importlib-metadata

Я попробовал запустить все варианты celery -A config.celery_app worker -l info и celery -A config.celery_app:app worker -l DEBUG из root folder

От cookiecutter-django README.md:

Для запуска рабочего сельдерея:

bash cd my_awesome_project celery -A config.celery_app worker -l info

Обратите внимание: чтобы магия импорта Celery работала, важно, чтобы где выполняются команды Celery. Если вы находитесь в одной папке с manage.py, то все должно быть правильно.

Я также использую redis, у меня запущен redis-server и также запущен localhost. Внутри redis-cli ping возвращает pong, так что все работает.

С чего я начал: https://realpython.com/asynchronous-tasks-with-django-and-celery/

Посты с похожими проблемами: (Django-Celery Error) ImportError: Нет модуля с именем myproject. Celery ImportError: Нет модуля с именем proj KeyError / замороженная ошибка importlib._bootstrap на втором импорте библиотеки в spyder Ошибка при запуске celery worker : ModuleNotFoundError: No module named 'mysite' https://www.reddit.com/r/django/comments/vcqr5e/celery_does_not_discovers_tasks_inside_django/

"Работающий" пример: https://github.com/stuartmaxwell/django-celery-example

Если кто-то сталкивался с подобной ошибкой, пожалуйста, оставьте отзыв, я буду очень признателен.

Добавлено

ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent
sys.path.append(str(ROOT_DIR / "src"))

в celery_app.py так же, как в обычных настройках, и теперь все работает.

Я некоторое время мучился с той же проблемой, пока не решил ее немного по-другому. Мой проект называется 'hivemind'. Мой файл settings.py находится по адресу ./hivemind/hivemind/settings.py.

В ./hivemind/manage.py:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hivemind.settings')
print("In manage.py, value of 'DJANGO_SETTINGS_MODULE': {}".format(
    os.environ.get('DJANGO_SETTINGS_MODULE', 'UNSET')
))

В ./hivemind/hivemind/celery.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hivemind.settings')
print("In celery.py, value of 'DJANGO_SETTINGS_MODULE': {}".format(
    os.environ.get('DJANGO_SETTINGS_MODULE', 'UNSET')
))

Когда я запускаю рой докеров, celery worker выводит:

In manage.py, value of 'DJANGO_SETTINGS_MODULE': hivemind.settings
In celery.py, value of 'DJANGO_SETTINGS_MODULE': hivemind.settings
In celery.py, value of 'DJANGO_SETTINGS_MODULE': settings

Каким-то образом celery.py был запущен дважды, и значение DJANGO_SETTINGS_MODULE изменилось между двумя запусками. Так что я не стал вежливо отмалчиваться, а решил проблему принудительно.

В ./hivemind/hivemind/celery.py

os.environ['DJANGO_SETTINGS_MODULE'] = 'hivemind.settings'
print("In celery.py, value of 'DJANGO_SETTINGS_MODULE': {}".format(
    os.environ.get('DJANGO_SETTINGS_MODULE', 'UNSET')
))

И теперь, кажется, все работает нормально. В конце концов, я попытаюсь выяснить, куда переписывается env var 'DJANGO_SETTINGS_MODULE', но пока мне просто нужно, чтобы он находил модуль настроек, и он находит.

In manage.py, value of 'DJANGO_SETTINGS_MODULE': hivemind.settings
In celery.py, value of 'DJANGO_SETTINGS_MODULE': hivemind.settings
In celery.py, value of 'DJANGO_SETTINGS_MODULE': hivemind.settings
Вернуться на верх