Sphinx和可重复使用的Django应用程序

时间:2016-11-07 20:01:27

标签: python django documentation python-sphinx

问题

在尝试为可重用的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。

更新

我后来发现如果从setupsetuptools导入distutils.core函数,可以调用安装脚本来编译文档,如python setup.py build_sphinx -b BUILDER那样通过setup.py或Sphinx提供的docs/conf.py调用make.bat MakeFile时,最好再次提出此问题。

我怀疑结果会相似,即包括docs/conf.py内提供的答案或setup.py内的答案,两者都必须在同一个Python会话中调用。

3 个答案:

答案 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()