2011-03-01 45 views
14

可能重复:
How to manage local vs production settings in Django?管理多个settings.py文件

我已成功地与mod_wsgi成功部署Django项目Apache的Web服务器上

我想就如何管理多个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 PROJECTS关于多个settings.py文件版本的最佳实践是什么?

+0

[如何在Django中管理本地和生产设置?](http://stackoverflow.com/questions/1626326/how-to-manage-本地与生产设置在Django)或[生产服务器的Django数据库设置](http://stackoverflow.com/questions/4887851/django-database-settings-for-production-server)或[Django dynamic设置基础结构和最佳实践](感谢Ned。)(http://stackoverflow.com/questions/2109352/django-dynamic-settings-infrastructure-and-best-practices) – 2011-03-01 20:25:04

+0

感谢Ned。我会投票结束我自己的问题。你提到的第一个有我正在寻找的答案。再次感谢。 – 2011-03-01 20:31:23

回答

25

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

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()来确定当前的机器是什么类型的服务器:它返回developmentproductiontesting

那么其他的文件看起来有点像(production.py):

DEBUG=False 
TEMPLATE_DEBUG=False 
from _base import * 

在每一个文件,我把仅适用于该服务器类型的设置。

+0

非常聪明的做法。我在这个问题上学到了很多东西。正如可能已经猜到的那样,我正在做DJANGO的第一步... :-) – 2011-03-01 22:47:04

6

django-admin.py/manage.py都接受--settings=mysite.settings选项。在开发中,您可以明确指定--settings=dev_settings。您也可以在您的apache配置中设置DJANGO_SETTINGS_MODUL E环境变量。

个人而言,我根本不检查settings.py。而是检查多个设置文件(dev_settings,prod_settings等),并按照需要将它们象征性地链接到settings.py。这样,如果我只是检查我的应用程序,它将不会运行,直到我想到哪个设置文件是合适的,并且实际上将该设置文件放在适当的位置。

另一个建议我听说过,但我特别不喜欢被有settings.py动态导入一个dev_settings.py如果它存在。虽然这可能更方便,但我担心settings.py难以阅读,并且知道设置实际上会是什么,而不会在dev_settings.py文件中查找可能存在也可能不存在的文件中的覆盖值。

+0

谢谢迈克。你的回答非常有帮助。 – 2011-03-01 20:35:24

8

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

环境无关的设置进入settings.py并在文件的底部,你会从local_settings.py

导入
try: 
    from local_settings import * 
except ImportError: 
    pass 

您可以在适当的LOCAL_SETTINGS覆盖任何settings.py设置。PY

+0

真棒技巧jboutros。谢谢。请记住它。 – 2011-03-01 21:33:41

2

我的首选方法是使用ConfigParser加载单独的ini文件,基于单个设置或环境变量。无论如何,在Django wiki中有很多不同的选项:http://code.djangoproject.com/wiki/SplitSettings

+0

另请参阅我对已标记为可能重复问题的扩展答案:http://stackoverflow.com/a/9517763/384417 – rewritten 2012-03-01 14:19:25