2012-02-09 40 views
2

我正在關注項目結構as laid out by Zachary Voase,但我正在努力解決一個特定問題。開發,分期和生產之間的單獨自定義設置變量

我非常希望有一個自定義設置布爾變量(我們稱之爲SEND_LIVE_MAIL),我將在項目中使用。基本上,我想在我的代碼中使用這個設置變量,如果SEND_LIVE_MAIL爲True,則實際發送郵件,而當它設置爲False時,只需將其內容輸出到控制檯。後者將適用於開發環境和運行unittests時。

什麼是一個很好的實現方法?目前,根據環境,django服務器使用dev,staging或prd設置,但對於自定義設置變量,我相信這些變量需要從字面上導入。換句話說,我會用我的看法如

from settings.development import SEND_LIVE_MAIL 

這當然不是我想要的。我希望能夠執行如下操作:

from settings import SEND_LIVE_MAIL 

並且根據環境的不同,將正確的值分配給SEND_LIVE_MAIL變量。

在此先感謝!

回答

6

不應該直接從您的設置文件導入。使用:

>>> from django.conf import settings 
>>> settings.SEND_LIVE_MAIL 
True 
1

對於各種基於環境的設置,您可以這樣做,但以下僅爲SEND_LIVE_MAIL的示例。

settings_config.py

import re 
import socket 

class Config: 
    def __init__(self): 
     fqdn = socket.getfqdn() 
     env = re.search(r'(devhost|stagehost|prodhost)', fqdn) 
     env = env and env.group(1) 
     env = env or 'devhost' 
     if env == 'devhost': 
      self.SEND_LIVE_MAIL = # whatever 
     elif env == 'stagehost': 
      self.SEND_LIVE_MAIL = # whatever 
     elif env == 'prodhost': 
      self.SEND_LIVE_MAIL = # whatever 

config = Config() 

settings.py

from settings_config import config 

SEND_LIVE_MAIL = config.SEND_LIVE_MAIL 
+0

這將是他目前實現設置的一種替代方法。由於他的項目目前已配置,因此它並不能真正爲他的問題提供解決方案。儘管如此,從實際的settings.py文件導入設置並不是一個好主意。 Django公開了在'django.conf.settings'中使用的實際設置,所以沒有理由做任何特殊的事情。 – 2012-02-09 20:55:42

3

最簡單的辦法是在你的設置文件的底部有這個:

try: 
    from local_settings import * 
except ImportError: 
    pass 

而在祿al_settings.py指定所有特定於環境的覆蓋。我通常不會將此文件提交到版本控制。

有更高級的做法,最終得到默認設置文件和每個環境的覆蓋。

本文由大衛·克萊默涵蓋了各種辦法,包括我提到的那些的:http://justcramer.com/2011/01/13/settings-in-django/

+0

OP使用的方法其實非常棒。我一直在使用它一段時間。它使您能夠將所有設置(生產,登臺,甚至多個開發人員設置)全部提交到您的存儲庫,然後您只需創建要使用的特定設置文件的符號鏈接。這很漂亮。 – 2012-02-10 15:33:20

2
import os 
PROJECT_PATH = os.path.dirname(__file__) 
try: 
    execfile(os.path.join(PROJECT_PATH, local_settings.py')) 
except IOError: 
    pass 

然後你可以有你的local_settings.py的行爲,如果它是直接粘貼到你的settings.py

$ cat local_settings.py 
INSTALLED_APPS += ['foo']