python - Celery worker 不会为应用程序启动 ImportError

标签 python django redis celery

我正在尝试将 celery 与 django 一起使用,并以 redis 作为代理。我的应用程序名称之一是用户,其模型由其他应用程序导入。当我运行 django 服务器时,它启动时没有任何错误,并且一切正常。

但是当我尝试使用命令“celery -A project worker -l INFO”启动 celery worker 时,出现以下错误:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 30, in main
    main()
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 81, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 793, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 311, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 785, in handle_argv
    return self.execute(command, argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 717, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 179, in run_from_argv
    return self(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 274, in __call__
    ret = self.run(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 212, in run
    state_db=self.node_format(state_db, hostname), **kwargs
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/__init__.py", line 95, in __init__
    self.app.loader.init_worker()
  File "/usr/local/lib/python2.7/dist-packages/celery/loaders/base.py", line 128, in init_worker
    self.import_default_modules()
  File "/usr/local/lib/python2.7/dist-packages/celery/loaders/base.py", line 116, in import_default_modules
    signals.import_modules.send(sender=self.app)
  File "/usr/local/lib/python2.7/dist-packages/celery/utils/dispatch/signal.py", line 166, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/usr/local/lib/python2.7/dist-packages/celery/fixups/django.py", line 73, in on_import_modules
    self.worker_fixup.validate_models()
  File "/usr/local/lib/python2.7/dist-packages/celery/fixups/django.py", line 158, in validate_models
    django_setup()
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/path_to_project/project/app1/models.py", line 2, in <module>
    from app1.models import *
  File "/path_to_project/project/project/models.py", line 9, in <module>
    from user.models import *
ImportError: No module named models

这里要注意的是,上面写着No module named models and not No module named user.models。这可能意味着与其他文件存在一些冲突,尽管我已经仔细检查并且在项目目录或 app1 目录中没有 user.py。如果我将应用程序“用户”重命名为“用户 2”,工作人员将启动。还需要注意的是, celery 在过去的某个时候开始很好。从那时起,代码发生了变化,但没有添加任何应用程序。

我的项目结构如下(只显示相关部分)

- project
  - project
    - celery.py
    - models.py
  - user
    - models.py
  - app1
    - models.py
    - tasks.py

celery.py 是

from __future__ import absolute_import

import os
from celery import Celery
from django.conf import settings

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

app = Celery('project')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

CELERY 配置是

BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

谢谢

最佳答案

问题是命名空间冲突。因为 python 2.x 中包含一个 user 配置 Hook ,并且在 python 3 中被删除。有关 user 的更多信息.

关于python - Celery worker 不会为应用程序启动 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36900832/

相关文章:

python - curses库导入报错pypy

python - 如何在Django中从服务器以缩进行显示user_list?

python - django 6 1.10.0没有名为http_client的模块错误

java - 使用 Jedis 的 Redis Key 过期通知

rest - 微服务编排的低层协议(protocol)

django - 在Django中如何实现redis连接管理的建议方式

python - 处理 ElasticSearch 最 Pythonic 的方法是什么?

在 while 循环内记录更改的 Pythonic 方式

django - 在哪里存储 key DJANGO

python - 实例变量自动修改