[アップデート]
構成/コードの分離のために、私は自分のものをロールバックする代わりにdjango-decoupleというプロジェクトを使用していますが、元の回答の理論的根拠は引き続き有効です。
[元の回答]
if/elif チェーンや include の代わりに環境変数を使用することをお勧めします。主な理由は次のとおりです。
- config はデプロイごとに大きく異なりますが、コードはそうではありません。したがって、config をコードから厳密に分離することを目指す必要があります。
- 環境固有の情報は、環境に関連しています。環境変数は、コードを変更することなく、デプロイ間で簡単に変更できます。
- パスワードなどの機密情報が誤ってソース管理にチェックインされるのを防ぎます。
例えば:
DATABASES = {
'default': {
'ENGINE': os.environ.get('DB_NAME', 'django.db.backends.sqlite3'),
'NAME': os.environ.get('DB_NAME', 'some_default'),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASS', ''),
'HOST': os.environ.get('DB_HOST', ''),
'PORT': '',
}
}
このプラクティスの背後にある原則についての詳細な説明については「12 要素アプリ」を、 Django 設定への実用的なアプローチについては「設定ファイルの書き込みをやめる」をお読みください。
また、virtualenv の使用をお勧めします。いくつかのヒント:
- アプリを /opt/django-apps/project_name のようなパスに配置します
- virtualenvwrapper をインストールし、次のようなパスの下にプロジェクトと同じ名前の virtualenv を作成します。
/var/lib/python-virtualenvs
workon project_name
プロジェクトで働きたいときにaを発行する
私は次のwsgi.py
ように使用します:
import os
import site
import sys
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(APP_ROOT)
PROJECT_NAME = os.path.basename(APP_ROOT)
INSTANCE_NAME = os.path.basename(ROOT)
VENV = '/var/lib/python-virtualenvs/{}/'.format(INSTANCE_NAME)
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir(VENV + 'lib/python2.7/site-packages')
# Add the app's directory to the PYTHONPATH
sys.path.append(ROOT)
# Activate your virtual env
activate_env=os.path.expanduser(VENV + "bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", PROJECT_NAME + ".settings")
from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()
def application(environ, start_response):
os.environ['DEBUG'] = environ['DEBUG']
os.environ['DB_NAME'] = environ['DB_NAME']
os.environ['DB_PASS'] = environ['DB_PASS']
os.environ['DB_HOST'] = environ['DB_HOST']
os.environ['DB_USER'] = environ['DB_USER']
return _application(environ, start_response)