安装新的django应用程序时,必须添加/修改settings.py模块。
对于一个项目,我正在尝试将该模块作为python子包并为每个应用程序创建一个模块:
settings\
__init__.py
base.py
admin.py
feincms.py
...
我遇到的问题是如何合并在不同子模块中获取值的settings.py属性(例如INSTALLED_APPS是一个值元组)?
由于
好的,我问错了问题(尽管得到了正确答案)。我的问题应该是,如何从所有子模块获取属性并合并它们? Django将导入设置并期望一切都在那里。
答案 0 :(得分:6)
“安装新的django应用程序时,必须添加/修改settings.py模块。”
我觉得这很好。
我认为没有任何理由可以改变或修改它。
然而,我们所做的是“子类化”核心设置模块。
我们的特定于开发人员和特定于安装的文件的名称类似于settings_devxy_linux2
和settings_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()
答案 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 *
并定义自定义属性