所以,这个是一个很糟糕的.我正在采取一种解决方法,但只是将其解决,以防有更好的解决方案.并且,在花了几个小时才弄明白之前,我也把它作为一个问题.
基本上,我想知道是否有巧妙的方法来避免对django.setup()的递归调用.
我有3或4个批处理脚本,我可以在独立模式或芹菜中运行.其中一个叫做build_profiles.py
celery查看它们(在其中一个tasks.py文件中)的方式:
from pssecurity.batch.build_profiles import \
ProfileManager as MgrCls_profiles, \
getOptParser as getOptParser_profiles
Run Code Online (Sandbox Code Playgroud)
在Django 1.6中,这种安排运行良好(我并不完全相信芹菜是推出潜在独立流程的最佳方式,但这是另一个故事).
当我尝试从命令行运行build_profiles.py时,它给出了AppRegistryNotReady错误.
没问题,我想,让我们将以下内容添加到build_profiles.py的顶部,按照https://docs.djangoproject.com/en/dev/ref/applications/#applications-troubleshooting
import django
django.setup()
Run Code Online (Sandbox Code Playgroud)
然后Django再没有任何工作了. 单元测试不会运行,manager.py runserver会挂起.如何改变独立批处理会使我的系统停止运行?
事实证明,django.setup()发现芹菜加载它的任务,如果其中一个最终做了自己的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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |