繁体   English   中英

如何模块化django settings.py?

[英]how to modularize django settings.py?

安装新的django应用程序时,必须添加/修改settings.py模块。

对于一个项目,我试图使该模块成为python子包并为每个应用程序创建一个模块:

settings\
    __init__.py
    base.py
    admin.py
    feincms.py
    ...

我遇到的问题是如何合并settings.py属性(例如INSTALLED_APPS是值的元组),它们在不同的子模块中获取值?

谢谢


好吧,我问错了问题(尽管得到了正确答案)。 我的问题应该是,如何从所有子模块获取属性并合并它们? Django将导入设置并期望一切都在那里。

“安装新的django应用程序时,必须添加/修改settings.py模块。”

我觉得这很好。

我认为没有任何理由可以改变或修改它。

然而,我们所做的是“子类化”核心设置模块。

我们的特定于开发人员和特定于安装的文件具有settings_devxy_linux2settings_checkout_win32等名称。

这些文件中的每一个都from settings import *开始,以导入核心设置并扩展这些核心设置,并覆盖特定的安装和平台。

它不需要任何实际工作。 但是,它确实意味着我们使用django-admin.py执行大多数操作,因为我们的设置不是调用settings

您可能对此解决方案感兴趣; 使用execfile()按顺序加载一系列设置文件,其中每个文件都可以完全访问以前加载的文件中的设置,更新,修改等。

我用过这个解决方法:

settings.py

INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())

more_settings.py

def modify(settings):
    settings['INSTALLED_APPS'] += ('another_app',)

我有相同的设置文件结构,我执行以下操作来导入子模块的设置:

def load_settings_file(file):
    file = open(os.path.join(INSTALL_DIR, '<projectname>', 'settings', file + '.py'))
    content = file.read()
    file.close()
    return content

for submodule in ['base', 'admin', 'feincms']:
    exec(load_settings_file(submodule))

我创建了https://code.djangoproject.com/wiki/SplitSettings#SettingInheritancewithHierarchy作为我的首选解决方案。 允许从任何部署环境中的公共文件继承。

据推测,“合并”的最佳方式因属性而异。 例如,给定几个元组(来自各个子模块的INSTALLED_APPS ),您可以简单地将它们连接成一个新的元组(对于整个包的INSTALLED_APPS属性),或者,如果可能重复是一个问题,那么更聪明的东西删除重复(在这种情况下,你可能不关心排序,所以简单的tuple(set(tup1+tup2+tup3))可能就足够了)。

对于其他情况(“合并”字典,“合并”设置,只是标量或字符串等),您将需要不同的策略(可能是字典的连续.update调用,根据标量或字符串的某些条件选择一个等等) - 我只是没有看到在这里工作的“一刀切”的方法。

如果你比我以前的more_settings.modify()方法更喜欢魔法,试试这个:

settings.py

INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())

more_settings.py

def config(INSTALLED_APPS=(), **other_settings):
    INSTALLED_APPS += ('another_app',)
    del other_settings
    return locals()

def modify(settings):
    settings.update(config(**settings))

优点:无需使用dict表示法来引用设置

缺点:必须将修改后的设置定义为config() kwargs

刚放好

from base import *
from admin import *
...

在你的init .py应该工作

我用它来做不同的网站

base/settings.py # common settings: db, apps, ...
base/sites/website1/settings.py # site_id, custom middleware 
base/sites/website2/settings.py # site_id, custom middleware

网站设置导入常用设置

from base.settings import *

并定义自定义属性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM