斯芬克斯和可重用Django应用程序

2024-06-17 12:16:46 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

在试图为一个可重用的Django应用程序生成sphinx文档时,我偶然发现了以下snafoo。当sphinx解析model.py代码时,它被其中试图访问Django项目设置的代码所阻碍。由于这是一个独立的/可重用的应用程序,因此没有一个主项目提供这些设置,即没有ROOT/PROJECT/PROJECT/settings.py文件。在

设置

为了清楚起见,我做了些什么。遍历到通常的项目文件夹cd ROOT/PROJECT,并创建一个应用程序django-admin startapp APPLICATION,它产生以下结构

^{1}$

注意:没有/ROOT/PROJECT/PROJECT/*.py文件,因为我没有像通常那样导航到文件夹cd root并使用django-admin createproject创建一个项目。在

下一步创建sphinx文档spinx-quickstart docs,生成以下附加结构。在

^{pr2}$

即文档被构建在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()
    

我也把这个问题弄得相当冗长,因为上面的相关问题非常简洁,没有特别的帮助。如果有什么帮助的话,我用的是django1.10。在

更新

我后来发现,如果一个人从setuptoolsdistutils.core导入他们的setup函数,那么你可以调用安装脚本来编译他们的文档,就像在python setup.py build_sphinx -b BUILDER中一样。在通过make.bat或Sphinx提供的docs/conf.py调用{}时,最好重新询问这个问题。在

不过,我怀疑结果会类似,即在docs/conf.py内或在setup.py内包含提供的答案,毕竟这两个答案都必须在同一个Python会话中调用。在


Tags: 文件项目django答案from文档pyimport
3条回答

如果您不想让文档依赖于“演示”项目,那么您可以在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()。在

我对django1.11和sphinx1.5.5也有同样的问题。我没能让它正常工作,你上面提到的所有解决方案也不起作用。最后我把这个加到我的狮身人面像上解决了这个问题配置文件公司名称:

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

这不是问题的答案

What do I place within conf.py to properly load the application without there being a settings.py file ?

但是另一种方法:在可重用包中放入一个最小的、可行的Django项目。它可以用于实现示例、测试(包括代码覆盖率)、开发和文档生成。我们在公司的私有存储库中这样做,我在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中,我检查设置环境变量,如果没有,则使用演示项目:

^{pr2}$

这样,您就可以在调用sphinx之前设置DJANGO_SETTINGS_MODULE环境变量,从而使用另一个项目来构建文档。在

settings.py只包含运行应用程序所需的最小配置。这些是绝对至最小功:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = ''
INSTALLED_APPS = [
    'mypackage'
]

相关问题 更多 >