2011-03-01 49 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