我有一个我正在构建的Django应用程序,我们将称为foo
。
由于构建了FOO的方式,因此需要许多第三方Django应用程序才能运行。例如,运行Foo
安装应用程序可能看起来像:
INSTALLED_APPS = ('prereq1',prereq2','foo')
实际上,要使Foo
甚至具有功能性,'prereq1', prereq2'
必须在Django中安装。现在,我可以将要求添加到requirements.txt
或setup.py
,以确保有人在安装Foo
时安装了库,但是我无法弄清楚是否有办法将它们安装在Django本身中。
这样做的原因是,如果有人想使用foo,我不想包括以下说明:
在您的
INSTALLED_APPS
中添加foo
,但也添加scary_looking_library_name
和thing_you_dont_understand
。
因此,INSTALLED_APPS
中的应用程序是否有可能以某种方式需要或将更多应用程序注入该列表?
我同意丹尼尔·罗斯曼(Daniel Roseman)关于系统检查框架的答案,是这些检查的最佳位置。系统检查框架引入了Django 1.7。
但是,假设您有文档,您也可以记录这些先决条件,例如Django REST框架在其安装说明中所做的。
然后,您可以执行代码中以下类似的操作(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
是我认为您应该处理的应用程序。
我通常在设计应用程序时尝试遵循Python的禅宗:
- "显式比隐式好。"
- 让开发人员手动输入
INSTALLED_APPS
中的依赖项
- 让开发人员手动输入
- "如果实现很难解释,那是一个坏主意。"
- 试图找出一种将依赖项注入
INSTALLED_APPS
的方法很难解释。如果第三方依赖性很复杂,请让开发人员决定。
- 试图找出一种将依赖项注入
- "简单胜于复杂。"
- 更容易记录依赖项,并要求开发人员将其添加到
INSTALLED_APPS
。
- 更容易记录依赖项,并要求开发人员将其添加到
- "应该有一个 - 最好只有一种 - 很明显的方法。"
- 普遍做法是让开发人员将第三方应用程序添加到
INSTALLED_APPS
-这就是为什么没有明显的方法可以做您想做的事情(注射)。
- 普遍做法是让开发人员将第三方应用程序添加到
如果开发人员想激活应用程序,则会。正如您在示例中雄辩地说的那样,scary_looking_library_name
和thing_you_dont_understand
是开发人员了解的责任。选择为开发人员安装它是施加不必要的安全风险。让开发人员选择使用您的应用程序并初始化其依赖项。
我认为系统检查框架将是一个好地方。您可以编写检查这些应用程序在设置中存在的检查,并在不存在的情况下引起错误。
我更喜欢进行依赖性检查,但是我认为您要求以下代码将所需的应用注入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)