管理多个settings.py文件
可能重复的问题:
如何管理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 个回答
django-admin.py 和 manage.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 文件中的覆盖值。
一个常见的做法是同时维护两个文件:settings.py 和 local_settings.py(每个环境一个)。
通用的设置放在 settings.py 文件里,而在文件的底部,你会从 local_settings.py 导入内容。
try:
from local_settings import *
except ImportError:
pass
你可以在相应的 local_settings.py 文件中覆盖 settings.py 里的任何设置。
我使用的设置模块不是一个单独的文件,而是由多个文件组成:
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 *
在这些文件中,我放入了只适用于特定服务器类型的设置。