【问题标题】:How to include prerequisite apps in INSTALLED_APPS如何在 INSTALLED_APPS 中包含必备应用程序
【发布时间】:2015-07-28 00:25:11
【问题描述】:

我正在构建一个 Django 应用程序,我们将其命名为 foo

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

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

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

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

在您的INSTALLED_APPS 中添加foo,同时添加scary_looking_library_namething_you_dont_understand

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我同意 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 - 这就是为什么没有明显的方法来做你想做的事(注入)。

      如果开发者想要激活应用程序,他们会的。正如您在示例中雄辩地指出的那样,scary_looking_library_namething_you_dont_understand 是开发人员理解的责任。选择为开发人员安装它会带来不必要的安全风险。让开发者选择使用你的应用并初始化它的依赖。

      【讨论】:

      • 我希望有一个干净的解决方案,但我认为你是对的。鉴于只有开发人员只会做这些事情,他们没有理由不能处理一些基本的先决条件。
      【解决方案3】:

      我更喜欢做依赖检查,但是我认为你需要下面的代码来将你想要的应用程序注入到 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)
      

      【讨论】:

      • apps.set_installed_apps() 是 Django 测试套件使用的私有方法,应谨慎使用。它不在 Django 的向后兼容性政策中,即使在次要版本升级中也会发生变化。
      • @knbk,我知道。我提到过依赖检查是首选。但是没有人要求向后兼容。 python也没有什么私有的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多