从可重用应用程序将依赖项注入INSTALLED_APPs

时间:2019-04-05 11:55:02

标签: django dependency-injection

我最近一直在将Django应用程序的集合旋转到一个命名空间中,以便我们可以将它们重用于具有不同设置,媒体文件等的多个部署中。其核心工作良好。我们可以创建一个新的Django项目,并在INSTALLED_APPS = [ 'django.contrib.contenttypes', 'django.contrib.auth', 'django.contrib.sessions', 'django.contrib.messages', 'import_export', 'rest_framework', 'reversion', 'crispy_forms', 'our_namespace.our_app', ] 中包含所需的所有应用程序(来自名称空间)。

我要解决的问题是,我们还必须明确包含命名空间应用程序所依赖的Django应用程序。例如,我们目前需要的位置:

INSTALLED_APPS = [
    'our_namespace.our_app',  # brings all its dependencies with it
]

我希望能够将其减少为:

INSTALLED_APPS

其他设置更易于处理,但注入AppConfig.ready()似乎很困难。从const theme = createMuiTheme({ palette: { primary: { main: "#46AD8D", contrastText: "white" //button text white instead of black }, background: { default: "#394764" } } }); 执行此操作似乎无效,因为(出于其他原因)only runs after models have imported(通常为时已晚)。

在这里我有什么选择?这次我只是太懒了吗?

1 个答案:

答案 0 :(得分:0)

我见过的一种使用方法是this one, by Mezzanine,它要求您在项目的设置文件底部调用一个方法:

try:
    from mezzanine.utils.conf import set_dynamic_settings
except ImportError:
    pass
else:
    set_dynamic_settings(globals())

如果您随后查看set_dynamic_settings的功能(请参阅上面的链接),它将检查到目前为止定义的设置并在适当的地方进行修改-包括对INSTALLED_APPS进行更改,例如:

def set_dynamic_settings(s):
    for app in required_apps:   # Where required_apps is a list if apps you need
        if app not in s["INSTALLED_APPS"]:
            s["INSTALLED_APPS"].append(app)

这是我知道做这种事情的唯一方法。尝试从自己的应用程序中进行操作(即,不向设置文件中添加任何其他代码)将无法正常工作,因为Django在加载应用程序时就已经初始化了设置对象。