首页 > 解决方案 > Django 导入搞砸了 Celery

问题描述

我有一个具有以下 Django 项目结构的 django 项目:

project/
  ...
  some_app/
    __init__.py
    some_module_where_i_import_some_utils.py
  server/
    __init__.py
    settings/
      __init__.py
      common.py
      dev.py
      ...
    celery.py
    ...
  utils/
    __init__.py
    some_utils.py
  manage.py
  ...

使用 utils 时,我通过以下方式导入它们:

from project.utils.some_utils import whatever

而且效果很好。但是,当我使用 celery worker 运行DJANGO_SETTINGS_MODULE=server.settings.dev celery -A server worker --beat -l info autodiscover_tasks失败并出现以下错误时ModuleNotFoundError: No module named 'project'

以下是内容server/celery.py

import os

from celery import Celery


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings.prod")

app = Celery("server")

app.config_from_object("django.conf:settings", namespace="CELERY")

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


@app.task(bind=True)
def debug_task(self):
    print("Request: {0!r}".format(self.request))

这里是server/__init__.py

from .celery import app as celery_app

__all__ = ("celery_app",)

标签: pythondjangocelery

解决方案


修改celery.py以下方式完成了这项工作:

import os
import sys

from celery import Celery

sys.path.append("..")
...

我不确定这是否会在未来引起问题,如果我想出更好的方法,我会继续调查并更新答案。


推荐阅读