[英]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_linux2
和settings_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.