调试此问题的第二天,我必须转向 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
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/#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
如果有人遇到类似的错误,请留下一些反馈,我将非常感激。
已添加
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')
))
当我运行 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