在尝试为可重用的Django应用程序生成sphinx文档时,我发现了以下snafoo。当sphinx解析model.py
代码时,其中的代码试图访问Django 项目设置会阻止它。由于这是一个独立/可重用的应用程序,因此没有提供这些设置的主项目,即没有ROOT/PROJECT/PROJECT/settings.py
文件。
为了清楚起见,这就是我所做的。遍历常用的项目文件夹cd ROOT/PROJECT
并创建应用程序 django-admin startapp APPLICATION
,它会生成以下结构
/ROOT/
/PROJECT/
/APPLICATION/
admin.py
apps.py
models.py
tests.py
views.py
注意:没有/ROOT/PROJECT/PROJECT/*.py
个文件,因为我没有导航到 root 文件夹cd root
并创建项目< / em>正常使用django-admin createproject
。
接下来创建sphinx文档spinx-quickstart docs
,生成以下附加结构。
/ROOT/
/PROJECT/
/docs/
/source/
...
conf.py
make.bat
这就是APPLICATION
旁边的文档。
如果没有conf.py
文件,我在settings.py
内如何正确加载应用?
在尝试解决此问题时,我已经仔细阅读了许多SO问题,博客和Django文档,但没有找到简洁的解决方案。因为之前已经有人问了几次,所以我想激励它不会被复制,如果建议的副本中的答案使用其中一个片段作为解决方案。
AppRegistryNotReady
from django.conf import settings
settings.configure()
与第一种失败方法类似,即发出AppRegistryNotReady
from django.conf import settings
settings.configure()
settings.INSTALLED_APPS += ['fintech']
ImproperlyConfigured
import django
django.setup()
有一个非常古老的解决方案,提到已弃用的setup_environ
from django.core.management import setup_environ
from django.conf import settings
settings.configure()
setup_environ(settings)
这也是最受欢迎的答案,但如果没有settings.py
文件则会失败。
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'PROJECT.settings'
django.setup()
我也提出这个问题相当冗长,因为关于SO的相关问题相当简洁,并不是特别有用。如果有任何帮助我正在使用Django 1.10。
我后来发现如果从setup
与setuptools
导入distutils.core
函数,可以调用安装脚本来编译文档,如python setup.py build_sphinx -b BUILDER
那样通过setup.py
或Sphinx提供的docs/conf.py
调用make.bat
MakeFile
时,最好再次提出此问题。
我怀疑结果会相似,即包括docs/conf.py
内提供的答案或setup.py
内的答案,两者都必须在同一个Python会话中调用。
答案 0 :(得分:9)
如果您不想让您的文档依赖于“演示”项目,那么您可以在conf.py
中手动构建设置。在路径设置部分:
import django
from django.conf import settings
import os
import sys
# add path to sys.path (this might be different in your project)
sys.path.insert(0, os.path.abspath('..'))
# pass settings into configure
settings.configure(
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_reusable_app',
'any_other_dependencies',
]
)
# call django.setup to load installed apps and other stuff
django.setup()
# ... continue with rest of conf.py
现在,Sphinx可以在没有项目settings.py
的情况下导入应用程序模块。其他设置可以传递给settings.configure()
。
答案 1 :(得分:2)
这不是问题的答案
如果没有
conf.py
文件,我在settings.py
内如何正确加载应用?
但另一种方法是:在可重用的软件包中放置一个最小的,可行的Django项目。它可用于实现示例,测试(包括代码覆盖),开发和doc生成。我们在我们公司的私有存储库中这样做,我在github上看到了一些django包,也是这样做的。
我的包的典型结构如下所示:
docs
├── conf.py
├── ... rst files
mypackage # the actual package
mypackage_demo # the Django project
├── .coveragerc
├── manage.py
├── settings.py
README.rst
requirements.txt
setup.py
在docs/conf.py
中,我检查设置环境变量,如果没有给出,请使用演示项目:
if not os.environ.get('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'mypackage_demo.settings'
django.setup()
通过在调用DJANGO_SETTINGS_MODULE
之前设置sphinx
环境变量,您可以使用其他项目构建文档。
settings.py
只包含运行应用程序所需的最小配置。 Django工作的绝对最小值是:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = ''
INSTALLED_APPS = [
'mypackage'
]
答案 2 :(得分:0)
我确实和Django 1.11和Sphinx 1.5.5有同样的问题。我没有设法让它正常工作,你上面提到的所有解决方案都不起作用。最后,我通过将其添加到我的Sphinx conf.py来解决它:
import sys, os
project_path = os.path.abspath('.')
# For Django to know where to find stuff.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
sys.path.append(project_path)
# For settings.py to load.
os.chdir(project_path)
# For the models to load.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()