管理多个settings.py文件

19 投票
4 回答
10454 浏览
提问于 2025-04-16 12:46

可能重复的问题:
如何管理Django中的本地和生产设置?

我已经成功地在Apache的网络服务器上部署了一个Django项目,使用的是mod_wsgi

我想要一些建议,关于如何管理多个settings.py文件。目前我有一个用于开发,另一个完全不同用于生产(涉及数据库参数、静态内容的本地化等)。我的settings.py文件是有版本控制的(我不知道这样做是否好),我用类似下面的方式来部署它:

$ hg archive myproject.tbz2
$ cd /path/of/apache/web/project/location
$ bzip2 -db /home/myself/myproject/myproject.tbz2 | tar -xvf -

现在运行得还不错。但是我发现自己在处理多个settings.py文件。

我想问的是:在部署Django项目时,关于多个settings.py文件版本,有哪些最佳实践?

4 个回答

7

django-admin.pymanage.py 都可以接受一个 --settings=mysite.settings 的选项。在开发过程中,你可以明确指定 --settings=dev_settings。你也可以在你的 Apache 配置中设置 DJANGO_SETTINGS_MODULE 环境变量。

就我个人而言,我通常不把 settings.py 文件放进版本控制里。相反,我会放多个设置文件(比如 dev_settings、prod_settings 等),然后根据需要把它们链接到 settings.py。这样,如果我只是检出我的应用程序,它是无法运行的,直到我考虑哪个设置文件是合适的,并且把那个设置文件放到正确的位置。

还有一个我听说过的建议,但我不太喜欢,就是有一个 settings.py 文件,它会动态导入一个 dev_settings.py 文件(如果存在的话)。虽然这样可能更方便,但我担心这样会让 settings.py 变得更难阅读,想要知道实际的设置是什么,就得去找可能存在的 dev_settings.py 文件中的覆盖值。

9

一个常见的做法是同时维护两个文件:settings.py 和 local_settings.py(每个环境一个)。

通用的设置放在 settings.py 文件里,而在文件的底部,你会从 local_settings.py 导入内容。

try:
    from local_settings import *
except ImportError:
    pass

你可以在相应的 local_settings.py 文件中覆盖 settings.py 里的任何设置。

30

我使用的设置模块不是一个单独的文件,而是由多个文件组成:

settings/
    __init__.py
    _base.py
    _servers.py
    development.py
    production.py
    testing.py

其中,__init__.py 文件很简单:

from _servers import get_server_type
exec("from %s import *" % get_server_type())

_base.py 文件包含了所有服务器类型共有的设置。

_servers.py 文件里有一个函数 get_server_type(),它通过 socket.gethostname() 来判断当前机器是什么类型的服务器:它会返回 development(开发环境)、production(生产环境)或 testing(测试环境)。

然后其他文件的结构大致像这样(production.py):

DEBUG=False
TEMPLATE_DEBUG=False
from _base import *

在这些文件中,我放入了只适用于特定服务器类型的设置。

撰写回答