如何模块化django settings.py?

时间:2010-01-10 01:37:16

标签: python django

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

对于一个项目,我正在尝试将该模块作为python子包并为每个应用程序创建一个模块:

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

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

由于


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

8 个答案:

答案 0 :(得分:6)

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

我觉得这很好。

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

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

我已经使用过这种方法:

<强> settings.py

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

<强> more_settings.py

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

答案 3 :(得分:1)

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

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))

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

如果您比我以前的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

答案 7 :(得分:-1)

刚刚放

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 *

并定义自定义属性