django 1.7rc3 和 celery 3.13 - AppRegistryNotReady

6 投票
3 回答
1616 浏览
提问于 2025-04-18 18:29

这对我来说不管用

$> 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 个回答

0

我也遇到了同样的问题,不过只是在:

CELERYBEAT_SCHEDULER='djcelery.schedulers.DatabaseScheduler'

你有开启这个吗?如果我用默认的celery调度器,它加载得很好。但是用Django调度器就加载不出来。

5

Django 1.7 现在对独立脚本的初始化方式有了新的要求。也就是说,当你不通过 manage.py 来运行程序时,你需要添加一些新的代码:

import django
django.setup()

你可以试着把这段代码放在你的脚本中 app = Celery('proj') 之前。

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

撰写回答