如何模块化Django的settings.py?
当你安装一个新的 Django 应用时,你需要添加或修改你的 settings.py 文件。
我正在尝试做一个项目,想把这个文件变成一个 Python 子包,并为每个应用创建一个模块:
settings\
__init__.py
base.py
admin.py
feincms.py
...
我遇到的问题是,如何将来自不同子模块的 settings.py 属性(比如 INSTALLED_APPS 是一个值的元组)合并在一起?
谢谢
好吧,我问错问题了(不过我得到了正确的答案)。我应该问的是,如何从所有子模块中获取属性并将它们合并?Django 会导入设置,并期望所有内容都在那儿。
7 个回答
6
我用过这个解决办法:
settings.py:
INSTALLED_APPS = ('whatever',)
import more_settings
more_settings.modify(globals())
more_settings.py:
def modify(settings):
settings['INSTALLED_APPS'] += ('another_app',)
8
当你安装一个新的django应用时,你需要添加或修改你的settings.py文件。
我觉得这样做没问题。
我看不出有什么理由需要改变或修改这个。
不过,我们的做法是“子类化”核心设置模块。
我们开发者特定和安装特定的文件名字像是 settings_devxy_linux2
和 settings_checkout_win32
等等。
这些文件的开头都是 from settings import *
,这样可以导入核心设置,并根据特定的安装和平台来扩展这些核心设置。
这其实不需要什么复杂的操作。不过,这意味着我们大多数时候都用 django-admin.py
来处理事情,因为我们的设置文件不叫 settings
。
7
你可能会对这个解决方案感兴趣;它使用execfile()来按顺序加载一系列设置文件,每个文件都可以完全访问之前加载的文件中的设置,以便进行更新、修改等操作。
$ ls settings/
10-base.conf
20-engines.conf
30-site.conf
...
$ cat settings.py
import os.path
import glob
conffiles = glob.glob(os.path.join(os.path.dirname(__file__), 'settings', '*.conf'))
conffiles.sort()
for f in conffiles:
execfile(os.path.abspath(f))