关于python:管理多个settings.py文件

Managing multiple settings.py files

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to manage local vs production settings in Django?

我已经成功地在Apache的Web服务器上使用mod_wsgi部署了一个django项目。

我想就如何管理多个settings.py文件提出一些建议。现在我有一个用于开发,另一个完全不同于生产(关于数据库参数、静态内容本地化等)。我的settings.py文件是版本化的(不知道这是否是一个好的实践),我使用如下方式部署它:

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

工作正常。但我发现自己在操纵多个settings.py文件。

我想我的问题是:在部署有关多个settings.py文件版本的django项目时,最佳实践是什么?


我使用的设置模块不是单个文件:

1
2
3
4
5
6
7
settings/
    __init__.py
    _base.py
    _servers.py
    development.py
    production.py
    testing.py

__init__.py文件很简单:

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

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

_servers.py文件包含一个函数get_server_type(),该函数使用socket.gethostname()来确定当前机器的服务器类型:返回developmentproductiontesting

然后其他文件看起来有点像(production.py):

1
2
3
DEBUG=False
TEMPLATE_DEBUG=False
from _base import *

在每个文件中,我都输入了仅适用于此服务器类型的设置。


最常见的技巧是同时维护settings.py和local_settings.py(每个环境一个)文件。

环境不可知设置进入settings.py,在文件底部,您将从local_settings.py导入

1
2
3
4
try:
    from local_settings import *
except ImportError:
    pass

您可以覆盖适当的local_settings.py中的任何settings.py设置。


django-admin.py/manage.py都接受--settings=mysite.settings选项。在开发中,您可以显式地指定--settings=dev_settings。您还可以在Apache配置中设置DJANGO_SETTINGS_MODULe环境变量。

就我个人而言,我只是不签入settings.py。相反,我签入多个设置文件(dev_settings、prod_settings等),并根据需要象征性地将它们链接到settings.py。这样,如果我简单地签出我的应用程序,它将无法运行,直到我考虑哪个设置文件是适当的,并将该设置文件放在适当的位置。

我听到的另一个建议是,如果存在dev_settings.py,动态导入settings.py,但我不特别喜欢它。虽然这可能更方便,但我担心如果不在dev ou settings.py文件中查找可能存在或可能不存在的覆盖值,就很难读取settings.py并知道实际的设置。


我的首选方法是使用configparser基于单个设置或环境变量加载单独的ini文件。总之,在django wiki中,有许多不同的选项可以描述:http://code.djangoproject.com/wiki/splitsettings