いろいろ詰め込むと、プログラムなのか設定ファイルなのか、わからなくなってくる。 個人プロジェクト用は、無理にDRYにして、隠したい設定は別ファイルから読み込む。 みんなで使うプロジェクト用は、環境毎に書き分ける。 conf/settings にまとめて放り込んで、symlinkを張る。
settings.py => conf/settings/runserver.py
conf/settings/runserver.py
conf/settings/production.py
conf/settings/staging_a.py
conf/settings/staging_b.py
conf/settings/staging_c.py
conf/settings/settings_overload.py => settings_overload_sample.py
conf/settings/settings_overload_sample.py
このような感じ。 以下、個人プロジェクト用の settings.py から。
DEBUG = (False, True)[0]
if os.path.exists("../_debug"):
DEBUG = (False, True)[1]
apacheではPATHが通らないので DEBUG = False 。 production でも manage.py runserver とやると admin が使えたり。 あまりお薦めしないけど、だって楽だから。。
CUSTOM_TEST
test は強制で(?) DEBUG = False で走るので test の時だけ、ああしたい、こうしたい時など。
CUSTOM_TEST = False
if sys.argv[0].split("/")[-1] == "manage.py" and sys.argv[1] == "test":
CUSTOM_TEST = True
cache 関連は test に支障が出るので manage.py test で実行された場合は外す。
MIDDLEWARE_CLASSES = (
'django.middleware.cache.CacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
CACHE_MIDDLEWARE_SECONDS = 10
if CUSTOM_TEST:
CACHE_BACKEND = 'dummy:///'
cache = "django.middleware.cache.CacheMiddleware"
if cache in MIDDLEWARE_CLASSES:
m = list(MIDDLEWARE_CLASSES)
m.remove(cache)
MIDDLEWARE_CLASSES = tuple(m)
_proj_path = "/path-to/django/michilu/"
_proj_name = "michilu"
if DEBUG:
_proj_path = ""
_proj_name = os.path.split(os.path.abspath(""))[-1]
_proj_db = os.path.abspath('%s../db/%s.db' % (_proj_path, _proj_name))
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = _proj_db
TEMPLATE_DIRS = (
'templates',
'helpdoc/templates',
'blog/templates',
'doc/templates',
)
TEMPLATE_DIRS = tuple(
[os.path.abspath("%s%s" % (_proj_path, _dir)).replace(os.sep, "/") for _dir in TEMPLATE_DIRS]
)
開発環境では checkout したディレクトリ名で sqlite の DB ファイルが作成される。 プロジェクト名の namespace が通らない場合は、これも symlink を張って、そこから manage.py runserver 。 いろんなブランチがあっても symlink で切り替えられる。 DB ファイルも混じらない。
global_settings に付け加えると間違いない。
from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
"michilu.utils.context_processors.context",
)
MEDIA_URL は svn版でサポートされたので、そのまま settings から読み込むようにする。 その他の domain/url 設定のようなものは fixtures にして Sites に入れておくといいかも。(しれないけど本来の使い方と違う方向か。。)
公開したくない設定は SECRET_KEY = None などと、そのままでは動かないような(結構重要!)ダミーにしておいて、別ファイルから読み込む。 普通に import でもよかったのか。
from utils.utils import get_optional_settings
optional_settings = get_optional_settings("%sconf/settings/settings_overload.py" % _proj_path)
if optional_settings:
for key,var in optional_settings.items():
vars()[key] = var
utils/utils.py
import os.path
import imp
def get_optional_settings(optional_settings=None):
_optional_settings = optional_settings or "conf/settings/settings_overload.py"
dir_name = os.path.dirname(_optional_settings)
file_name = os.path.basename(_optional_settings).split(".")[0]
_settings = None
result = {}
try:
f, fn, desc = imp.find_module(file_name, [dir_name])
_settings = imp.load_module(file_name, f, fn, desc)
except ImportError:
pass
if _settings:
for key in _settings.__dict__.keys():
if not key[0].startswith("_"):
result[key] = _settings.__dict__[key]
return result
忘れずに
RESTRUCTUREDTEXT_FILTER_SETTINGS = {
'doctitle_xform': False,
}
としておく。
