私はDjangoの開発を行うときにSQLiteを使用する傾向があり ますが、ライブ サーバーではより堅牢なものが必要になることがよくあります (たとえば、 MySQL / PostgreSQLなど)。常に、Django の設定には他にも変更を加える必要があります: 異なるログの場所/強度、メディア パスなどです。
これらすべての変更をどのように管理して、デプロイをシンプルで自動化されたプロセスにしますか?
更新: django-configurationsがリリースされました。これは、手動で行うよりも、ほとんどの人にとっておそらくより良いオプションです。
手動で行う場合でも、以前の回答が当てはまります。
複数の設定ファイルがあります。
settings_local.py
-データベース名、ファイルパスなどのホスト固有の構成。settings_development.py
-開発に使用される構成DEBUG = True
。settings_production.py
-本番環境で使用される構成SERVER_EMAIL
。これらすべてを、最初にインポートし、次に他の2つのうちの1つをインポートするsettings.py
ファイルと結び付けます。-とsettings_local.py
の2つの設定でどちらをロードするかを決定します。 を呼び出して、実行中のマシンのホスト名を検索し、リストでそのホスト名を検索し、ホスト名が検索されたリストに応じて2番目の設定ファイルをロードします。settings_local.py
DEVELOPMENT_HOSTS
PRODUCTION_HOSTS
settings.py
platform.node()
そうすれば、本当に心配する必要があるのは、settings_local.py
ファイルをホスト固有の構成で最新の状態に保つことだけであり、それ以外はすべて自動的に処理されます。
ここで例を確認してください。
個人的には、プロジェクトに単一の settings.py を使用します。それが存在するホスト名を検索するだけです (私の開発マシンには「gabriel」で始まるホスト名があるため、これだけです:
import socket
if socket.gethostname().startswith('gabriel'):
LIVEHOST = False
else:
LIVEHOST = True
次に、他の部分には次のようなものがあります。
if LIVEHOST:
DEBUG = False
PREPEND_WWW = True
MEDIA_URL = 'http://static1.grsites.com/'
else:
DEBUG = True
PREPEND_WWW = False
MEDIA_URL = 'http://localhost:8000/static/'
等々。少し読みにくいですが、問題なく動作し、複数の設定ファイルを調整する必要がありません。
settings.py の最後には、次のものがあります。
try:
from settings_local import *
except ImportError:
pass
このように、デフォルト設定を上書きしたい場合は、settings.py のすぐ隣に settings_local.py を配置するだけです。
2つのファイルがあります。settings_base.py
これには共通/デフォルト設定が含まれ、ソース管理にチェックインされます。各デプロイメントには個別settings.py
のがあり、最初に実行from settings_base import *
され、必要に応じてオーバーライドされます。
私が見つけた最も単純な方法は次のとおりです。
1)ローカル開発にデフォルトのsettings.pyを使用し、2)次で始まるproduction-settings.pyを作成します。
import os
from settings import *
そして、本番環境で異なる設定をオーバーライドするだけです。
DEBUG = False
TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
....
}
}
複数のデータベースを使用して Django 自体をデプロイする問題については、多少関連しますが、Djangostackを参照してください。Apache、Python、Django などをインストールできる完全に無料のインストーラーをダウンロードできます。インストール プロセスの一環として、使用するデータベース (MySQL、SQLite、PostgreSQL) を選択できます。内部で展開を自動化する場合は、インストーラーを広範囲に使用します (無人モードで実行できます)。
Jim が言及した複数の設定ファイルに加えて、私は settings.py ファイルの上部に 2 つの設定を配置し、コードのパスとサイトのベースへの URL を設定する傾向がありますBASE_DIR
。BASE_URL
他のすべての設定は変更されます。これらに自分自身を追加します。
BASE_DIR = "/home/sean/myapp/"
例えばMEDIA_ROOT = "%smedia/" % BASEDIR
したがって、プロジェクトを移動するときは、これらの設定を編集するだけでよく、ファイル全体を検索する必要はありません。
また、リモート デプロイの自動化を促進する fabric とCapistrano (Ruby ツールですが、Django アプリケーションのデプロイに使用できます)も検討することをお勧めします。
外部ディレクトリに settings.py ファイルがあります。そうすれば、ソース管理にチェックインされたり、デプロイによって上書きされたりすることはありません。これを Django プロジェクトの下の settings.py ファイルに、デフォルト設定とともに入れます。
import sys
import os.path
def _load_settings(path):
print "Loading configuration from %s" % (path)
if os.path.exists(path):
settings = {}
# execfile can't modify globals directly, so we will load them manually
execfile(path, globals(), settings)
for setting in settings:
globals()[setting] = settings[setting]
_load_settings("/usr/local/conf/local_settings.py")
注: local_settings.py を信頼できない場合、これは非常に危険です。
さて、私はこの構成を使用します:
settings.py の末尾:
#settings.py
try:
from locale_settings import *
except ImportError:
pass
そして locale_settings.py で:
#locale_settings.py
class Settings(object):
def __init__(self):
import settings
self.settings = settings
def __getattr__(self, name):
return getattr(self.settings, name)
settings = Settings()
INSTALLED_APPS = settings.INSTALLED_APPS + (
'gunicorn',)
# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
複雑な答えがたくさん!
すべての settings.py ファイルには以下が含まれます。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
そのディレクトリを使用して、次のように DEBUG 変数を設定します (開発コードがあるディレクトリに置き換えます)。
DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
DEBUG = True
その後、settings.py ファイルが移動されるたびに、DEBUG が False になり、それが本番環境になります。
開発環境の設定とは異なる設定が必要になるたびに、次を使用します。
if(DEBUG):
#Debug setting
else:
#Release setting
SQLite の使用からステップ アップする必要があるかどうかは、サイトのサイズに依存すると思います。私はいくつかの小規模なライブ サイトで SQLite をうまく使用しており、うまく機能しています。
私は環境を使用します:
if os.environ.get('WEB_MODE', None) == 'production' :
from settings_production import *
else :
from settings_dev import *
最終的にはテスト環境に特別な設定が必要になり、それをこの条件に簡単に追加できるため、これははるかに優れたアプローチだと思います。