Django 1.4 で新しくプロジェクトを作成した際にしておくsettings.pyの設定

django 1.4 からはプロジェクトを作成した際のディレクトリ構成が変わったのでどのように設定するのがいいかを、まだ数の少ないネット上のサンプルを参考にしつつまとめてみた。

ちなみに以下の様な構成を想定してます。

└── project_root
    ├── app1
    │   ├── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── app2
    │   ├── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── package_root
        ├── __init__.py
        ├── settings.py
        ├── site_media
        │   ├── media
        │   └── static
        ├── static
        ├── templates
        ├── urls.py
        └── wsgi.py

settings.pyを編集

序盤は公式ドキュメントのチュートリアルにも出てくるような内容だけど一応。path周りが今回のメインだけど、正直この構成がベストプラクティスなのかはわからない。

データベース設定
# とりあえず冒頭で os モジュールをインポートしておく
import os

# 中略

# データベースの設定。とりあえずsqlite3。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'example.sqlite',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}
タイムゾーン言語コードの設定を変更
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'
各種Pathの指定
# プロジェクトのルート。
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
# パッケージのルート(settings.pyの入っているディレクトリ)
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))

# ユーザーからアップロードされた画像などを保存する場所
MEDIA_ROOT = os.path.join(PACKAGE_ROOT, 'site_media', 'media')
MEDIA_URL = '/site_media/media/'
# js/css/imgなどの静的ファイルの保存場所
STATIC_ROOT = os.path.join(PACKAGE_ROOT, 'site_media', 'static')
STATIC_URL = '/site_media/static/'
# 特定のアプリと関係のないstaticファイルの格納場所
STATICFILES_DIRS = (
    os.path.join(PACKAGE_ROOT, 'static'),
)
# テンプレートファイルの格納場所
TEMPLATE_DIRS = (
    os.path.join(PACKAGE_ROOT, 'templates'),
)

os.path関連の解説

os.path周りのちょっとした解説をしておきます。ほんとちょっとだけ。__file__ == /home/kk6/hoge.py だとします。

絶対パスの表示
os.path.abspath(__file__)  # /home/kk6/hoge.py
ファイルのディレクトリの表示
os.path.dirname(__file__)  # /home/kk6
1階層上のディレクトリを表す
os.pardir  # '..'
カレントディレクトリ
os.curdir  # '.'
ディレクトリ間のセパレータ
os.sep  # '/'
ファイル名と拡張子のセパレータ
os.extsep  # '.'

以上を踏まえた上で

# これだとなんかモヤモヤするので
os.path.join(os.path.dirname(__file__), os.pardir)  # /home/kk6/..

# 絶対パスにする
os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)  # /home

結局...

os モジュールをしっかり理解すればそれで済むことに気づいた。