django 1.7rc3 和 celery 3.13 - AppRegistryNotReady
这对我来说不管用
$> 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