我有一个Django App我的建筑物,我们称之为foo
。
由于Foo的构建方式,它需要许多第三方django应用程序才能运行。例如,要运行Foo
,安装应用可能如下所示:
INSTALLED_APPS = ('prereq1',prereq2','foo')
事实上,要使Foo
功能正常,必须在django中安装'prereq1', prereq2'
。现在,我可以向requirements.txt
或setup.py
添加要求,以确保在有人安装Foo
时安装了库,但我无法确定是否有办法将它们安装在Django本身。
原因是如果有人想要使用Foo,我不想包含以下说明:
在
INSTALLED_APPS
添加foo
,但也添加scary_looking_library_name
和thing_you_dont_understand
。
那么INSTALLED_APPS
中的应用程序是否有可能以某种方式要求或将更多应用程序注入该列表?
答案 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:
INSTALLED_APPS
INSTALLED_APPS
的方法很难解释。如果第三方依赖项很复杂,请让开发人员决定。INSTALLED_APPS
。INSTALLED_APPS
- 这就是为什么没有明显的方法可以做你想要的(注入)。如果开发者想要激活某个应用,他们会。正如您在示例中雄辩地指出的那样,scary_looking_library_name
和thing_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)