如何模块化Django的settings.py?

26 投票
7 回答
15698 浏览
提问于 2025-04-15 17:51

当你安装一个新的 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_linux2settings_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))

撰写回答