Django 1.7rc3和Celery 3.13 - AppRegistryNotReady

6
这对我没用。

$> cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

django 版本为1.7rc3
celery 版本为3.1.13
python 版本为2.7

我尝试运行

celery worker -A <project_name>

而我得到

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

runserver 命令能正常工作,因此我认为问题不在我的设置上?

python manage.py runserver 0.0.0.0:8080

我已经仔细检查了celery.py并确认以下行的值是正确的:
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

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

还有其他应该做的事情吗?

3个回答

5

Django 1.7现在需要不同的初始化方式来运行独立脚本。 当在manage.py上下文之外运行时,您现在需要包含以下内容:

import django
django.setup()

请尝试在脚本中的 app = Celery('proj') 之前添加它。


嗨,如果您看到此问题:https://github.com/celery/celery/issues/2126 您会注意到Celery开发人员明确表示不要在您的celery.py中调用此函数。 - w--
@w--,是的,但它似乎对人们有效,而且Celery开发人员没有充分解释为什么不要在celery.py中调用它,或者应该做什么。 - tadasajon

1
我发现这个失败的原因是因为我在我的tasks.py文件中有这样一个东西。
CURRENT_DOMAIN = Site.objects.get_current().domain

我暂时通过侧步这个问题来解决。

CURRENT_DOMAIN = lambda: Site.objects.get_current().domain

目前正在等待看看Github上是否有人能提供更好的建议。 https://github.com/celery/celery/issues/2227

如果有,我会更新。如果没有,我可能只会编写一个帮助函数,它会懒惰地返回我想要的值。

更新
在Celery作者的建议下,我重构了我的代码,这样我就不会在模块级别调用该调用了。
他还通过确保在导入任务模块之前调用django.setup()来解决了这个问题。
https://github.com/celery/celery/issues/2227


0

我也遇到了同样的问题,但只出现在:

CELERYBEAT_SCHEDULER='djcelery.schedulers.DatabaseScheduler'

你启用了这个吗?如果我使用默认的celery调度程序运行它,它可以正常加载。但是无法使用Django调度程序加载。


使用最新版本的 Celery,我认为你不应该再使用 Djcelery 了。我将 celerybeat 作为守护进程运行,并且在我的 settings.py 中唯一的配置是 CELERYBEAT_SCHEDULE = {<计划定义>}。由于我没有定义它,所以我认为我正在使用默认设置。 - w--
是的,我喜欢在DJ管理中创建和管理作业的能力。时间学习另一种方法了,我猜 :) - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接