2012-02-09 17 views
2

私はプロジェクト構造as laid out by Zachary Voaseに従っていますが、私は特定の問題を抱えています。開発、ステージング、プロダクションの間でカスタム設定変数を分離

私は、私がプロジェクトで使用しているカスタム設定のブール変数(SEND_LIVE_MAILと呼ぶことができます)を持っていたいと思います。基本的には、私のコードでこの設定変数を使いたいのですが、SEND_LIVE_MAILがTrueの場合は実際にメールを送りますが、Falseに設定されている場合はその内容をコンソールに出力します。後者はdev環境とunittestを実行するときに適用されます。

これを実装するにはどうすればよいでしょうか?現在、環境に応じて、djangoサーバはdev、staging、またはprd設定を使用しますが、カスタム設定変数の場合、これらを「文字通り」インポートする必要があると私は信じています。言い換えれば、私は私の意見に何かを使用したいと思っています。

もちろん私が望むものではありません。

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'で使用するようにしていますので、何か特別なことをする理由はありません。 –

3

try: 
    from local_settings import * 
except ImportError: 
    pass 

そして、loc al_settings.pyは、すべての環境固有の上書きを指定します。私は一般に、このファイルをバージョン管理にコミットしません。

さらに高度な方法があります。ここでは、デフォルト設定ファイルと環境単位のオーバーライドが行われます。

デビッド・クレイマーによるこの記事では、私が言及したものの両方を含む様々なアプローチ、カバー:それはあなたのsettings.pyに直接貼り付けられたかのように、あなたのlocal_settings.py振る舞いを持つことができhttp://justcramer.com/2011/01/13/settings-in-django/

+0

OPが使用している方法は、実際にはかなり素晴らしいです。私はしばらくそれを自分で使ってきました。それはあなたのリポジトリにあなたのすべての設定(生産、ステージング、複数の個々の開発者の設定さえ)をコミットする能力をあなたに与えます。そして、あなたは、使用したい特定の設定ファイルへのシンボリックリンクを作成するだけです。それはかなり滑らかです。 –

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

を:

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