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

时间:2015-05-15 23:51:51

标签: python django

我有一个Django App我的建筑物,我们称之为foo

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

INSTALLED_APPS = ('prereq1',prereq2','foo')

事实上,要使Foo功能正常,必须在django中安装'prereq1', prereq2' 。现在,我可以向requirements.txtsetup.py添加要求,以确保在有人安装Foo时安装了库,但我无法确定是否有办法将它们安装在Django本身。

原因是如果有人想要使用Foo,我不想包含以下说明:

  

INSTALLED_APPS添加foo,但也添加scary_looking_library_namething_you_dont_understand

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

3 个答案:

答案 0 :(得分:17)

我同意Daniel Roseman关于system checks framework作为这些检查的最佳位置的答案。系统检查框架是介绍Django 1.7。

但是,假设您有文档,您还可以记录这些先决条件,例如Django REST Framework did in their installation instructions

然后,您可以在代码中执行以下操作(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.'
)

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

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

我在设计应用程序时通常会尝试遵循Zen of Python

  1. "明确比隐含更好。"
    • 让开发人员在INSTALLED_APPS
    • 中手动输入依赖项
  2. "如果实施难以解释,那就不错了。"
    • 试图找出将依赖关系注入INSTALLED_APPS的方法很难解释。如果第三方依赖项很复杂,请让开发人员决定。
  3. "简单比复杂更好。"
    • 更容易记录依赖项,并要求开发人员将其添加到INSTALLED_APPS
  4. "应该有一个 - 最好只有一个 - 显而易见的方法。"
    • 通常的做法是让开发人员将第三方应用添加到INSTALLED_APPS - 这就是为什么没有明显的方法可以做你想要的(注入)。
  5. 如果开发者想要激活某个应用,他们会。正如您在示例中雄辩地指出的那样,scary_looking_library_namething_you_dont_understand是开发人员有责任理解的。选择为开发人员安装它会带来不必要的安全风险。让开发人员选择使用您的应用程序并初始化其依赖项。

答案 1 :(得分:6)

我认为system check framework会是一个好地方。您可以编写一个检查来验证设置中是否存在这些应用,如果不存在则会引发错误。

答案 2 :(得分:2)

我更喜欢进行依赖性检查,但我认为您需要以下代码将所需的应用程序注入django网站。

你必须将它放在某个地方执行,并在加载依赖项时检查不要重新执行。 如果您使用它,'someapp' in settings.INSTALLED_APPS将无法正常工作。也许你还需要改变它。

from django.apps import apps
installed_apps = [app.__name__ for app in apps.get_apps()]
new_installed_app = installed_app + ['your desired app1', 'your desired app2', ...]
apps.set_installed_apps(new_installed_apps)