django 1.7 陷阱 - django.setup() 意外递归调用

标签 django

所以,这个真是太棒了。我正在提出一种解决方法,但只是将其提出,以防万一有更好的解决方案。而且,在弄清楚这一点之前我花了几个小时,我也将其作为一个陷阱提出来。

基本上,我想知道是否有聪明的方法来避免递归调用 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/

相关文章:

python - 我如何在 Django 中从 HTML 标签按钮在后台触发 Python 脚本?

python - Django REST 框架 : how to make verbose name of field differ from its field_name?

python - psycopg2.IntegrityError : duplicate key value violates unique constraint DETAIL: Key (id)=(19) already exists

python - 使用 Django Rest Framework 上传文件

django - 运行时 Django 1.8 的动态模型

django - django表单提交后触发引导模式

Django "with"模板标记为外键关系呈现为空

Django 1.3 测试错误 : ValueError: list. remove(x): x not in list

python - 我应该将 Python 3.5 降级到 3.4 吗?

javascript - 使用包含 Django 的图像将 HTML 渲染为 PDF