如何在INSTALLED_APPS中包含必备应用程序

11 python django

我有一个我正在构建的Django应用程序,我们将调用它foo.

由于Foo的构建方式,它需要许多第三方django应用程序才能运行.例如,运行Foo安装应用程序可能如下所示:

INSTALLED_APPS = ('prereq1',prereq2','foo')
Run Code Online (Sandbox Code Playgroud)

事实上,为了Foo甚至功能,'prereq1', prereq2' 必须安装在django.现在,我可以添加需求requirements.txtsetup.py确保在有人安装时安装库Foo,但我无法弄清楚是否有办法在Django本身安装它们.

原因是如果有人想要使用Foo,我不想包含如下指令:

在你的INSTALLED_APPS添加,foo但也添加scary_looking_library_namething_you_dont_understand.

那么应用程序是否有可能INSTALLED_APPS以某种方式要求或将更多应用程序注入该列表?

Mic*_*l B 17

我同意Daniel Roseman关于系统检查框架是这些检查的最佳位置的答案.系统检查框架是Django 1.7引入的.

但是,假设您有文档,您还可以在其安装说明中记录这些先决条件,例如Django REST Framework.

然后,您可以在代码中执行类似下面的操作(以django-mptt为例):

try:
    from mptt.fields import TreeForeignKey
    from mptt.models import MPTTModel
except ImportError:
    raise ImportError(
        'You are using the `foo` app which requires the `django-mptt` module.'
        'Be sure to add `mptt` to your INSTALLED_APPS for `foo` to work properly.'
)
Run Code Online (Sandbox Code Playgroud)

这是我在多个应用程序中使用的方法.阅读文档的责任在于开发人员.

也许这是一个不受欢迎/不必要的意见,但注入依赖关系INSTALLED_APPS并不是我觉得你应该用你的应用程序处理的.

我通常在设计应用程序时尝试遵循PythonZen:

  1. "明确比隐含更好."
    • 让开发人员手动输入依赖项 INSTALLED_APPS
  2. "如果实施难以解释,这是一个坏主意."
    • 试图找出一种将依赖关系注入其中的INSTALLED_APPS方法很难解释.如果第三方依赖项很复杂,请让开发人员决定.
  3. "简单比复杂更好."
    • 记录依赖项更容易,并要求开发人员将它们添加到INSTALLED_APPS.
  4. "应该有一个 - 最好只有一个 - 明显的做法."
    • 通常的做法是让开发人员添加第三方应用程序INSTALLED_APPS- 这就是为什么没有明显的方法来做你想要的(注入).

如果开发人员想要激活应用程序,他们会.正如您在您的示例中雄辩地阐述的那样,scary_looking_library_name并且thing_you_dont_understand开发人员有责任理解.选择为开发人员安装它会带来不必要的安全风险.让开发人员选择使用您的应用程序并初始化其依赖项.


Dan*_*man 6

我认为系统检查框架将是一个很好的地方.您可以编写一个检查来验证设置中是否存在这些应用程序,如果不存在则会引发错误.