Django + Celery 中没有名为“project_name”的模块?

问题描述 投票:0回答:2

调试此问题的第二天,我必须转向 stackoverflow,我正处于边缘。

几个月前我使用 cookiecutter-django 生成我的项目。

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

当我在配置中创建

celery.py
时,我收到一个错误,因为它是以包命名的,所以我用 google 搜索并尝试使用
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()
config/

内的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_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 信息

请注意:要使 Celery 的导入魔法发挥作用,这一点很重要 where 运行 celery 命令。如果您与 manage.py 在同一个文件夹中,那么您应该是对的。

我也在使用

redis
,我有
redis-server
正在运行,并且
localhost
也正在运行。内部
redis-cli
ping
返回
pong
所以它可以工作。

我从哪里开始: https://realpython.com/asynchronous-tasks-with-django-and-celery/

有类似问题的帖子: (Django-Celery 错误)导入错误:没有名为 myproject 的模块 Celery ImportError:没有名为 proj 的模块 spyder 中第二个库导入时出现 KeyError / freeze importlib._bootstrap 错误 运行 celery worker 时出错:ModuleNotFoundError:没有名为“mysite”的模块 https://www.reddit.com/r/django/comments/vcqr5e/celery_does_not_discovers_tasks_inside_django/

“工作”示例: https://github.com/stuartmaxwell/django-celery-example

如果有人遇到类似的错误,请留下一些反馈,我将非常感激。

django celery django-celery python-importlib cookiecutter-django
2个回答
2
投票

已添加

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

到 celery_app.py 就像常规设置一样,现在它可以工作了。


0
投票

在我以稍微不同的方式修复它之前,我遇到了同样的问题一段时间。我的项目在下文中称为“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')
))

当我运行 docker swarm 时,celery 工作线程输出:

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')
))

现在一切似乎都正常。最终,我将尝试找出“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
© www.soinside.com 2019 - 2024. All rights reserved.