所以,这个真是太棒了。我正在提出一种解决方法,但只是将其提出,以防万一有更好的解决方案。而且,在弄清楚这一点之前我花了几个小时,我也将其作为一个陷阱提出来。
基本上,我想知道是否有聪明的方法来避免递归调用 django.setup()。
我有 3 或 4 个批处理脚本,可以在独立模式下或从 celery 运行。其中之一称为 build_profiles.py
celery 查看它们的方式(在task.py 之一中)文件:
from pssecurity.batch.build_profiles import \
ProfileManager as MgrCls_profiles, \
getOptParser as getOptParser_profiles
在 Django 1.6 中,这种安排工作得很好(我并不完全相信 celery 是启动潜在独立进程的最佳方式,但那是另一个故事了)。
当我尝试从命令行运行 build_profiles.py 时,它给出了 AppRegistryNotReady 错误。
没问题,我想,让我们将以下内容添加到 build_profiles.py 的顶部,按照https://docs.djangoproject.com/en/dev/ref/applications/#applications-troubleshooting
import django
django.setup()
然后 Django 就不再起作用了。单元测试将无法运行,manager.py runserver 将挂起。对独立批处理的更改怎么会导致我的系统停止运行?
结果是 django.setup() 发现了加载其任务的 celery,如果其中一个最终执行了自己的 django.setup()...
最佳答案
为了在 @jl-peyret 的示例上进行一些构建,我使用了以下代码片段来触发文件顶部的异常,而无需包装模型访问并知道将首先访问哪个模型:
from django.core.exceptions import AppRegistryNotReady
try:
from django.apps import apps
apps.check_apps_ready()
except AppRegistryNotReady:
import django
django.setup()
关于django 1.7 陷阱 - django.setup() 意外递归调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745351/