View All Posts. MiCHiLU.com powered by Django ;-)

[Django]: Django settings

いろいろ詰め込むと、プログラムなのか設定ファイルなのか、わからなくなってくる。 個人プロジェクト用は、無理に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

DEBUG = (False, True)[0]
if os.path.exists("../_debug"):
    DEBUG = (False, True)[1]

apacheではPATHが通らないので DEBUG = False 。 production でも manage.py runserver とやると admin が使えたり。 あまりお薦めしないけど、だって楽だから。。

TEST 用のフラグ

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

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)

PATH

_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",
)

Sites

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,
}

としておく。

Tue, 19 Jun 2007 14:37:53 +0900 source edit
Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.
View All Posts. MiCHiLU.com powered by Django ;-)