私は基本的なアプリを開発しています。展開段階で、ローカル設定と本番設定の両方が必要であることが明らかになりました。
次のことを知っておくとよいでしょう。
- 開発および本番設定を処理する最善の方法。
- django-debug-toolbar などのアプリを開発環境のみに保持する方法。
- 開発と展開の設定に関するその他のヒントとベスト プラクティス。
DJANGO_SETTINGS_MODULE
環境変数は、Django がロードする設定ファイルを制御します。
したがって、それぞれの環境用に個別の構成ファイルを作成し (もちろん、それらはimport *
個別の「共有設定」ファイルから両方とも可能であることに注意してください)、どちらを使用DJANGO_SETTINGS_MODULE
するかを制御するために使用します。
方法は次のとおりです。
Djangoのドキュメントに記載されているように:
DJANGO_SETTINGS_MODULE の値は、mysite.settings などの Python パス構文にする必要があります。設定モジュールは Python インポート検索パス上にある必要があることに注意してください。
したがって、ソース リポジトリにと を作成したmyapp/production_settings.py
と仮定しましょう。myapp/test_settings.py
その場合、それぞれDJANGO_SETTINGS_MODULE=myapp.production_settings
前者を使用するように設定しDJANGO_SETTINGS_MODULE=myapp.test_settings
、後者を使用するように設定します。
ここから先は、問題はDJANGO_SETTINGS_MODULE
環境変数の設定に要約されます。
DJANGO_SETTINGS_MODULE
スクリプトまたはシェルを使用した設定次に、ブートストラップ スクリプトまたはプロセス マネージャーを使用して (環境を設定することにより) 正しい設定を読み込むか、Django を起動する前にシェルから実行しますexport DJANGO_SETTINGS_MODULE=myapp.production_settings
。
このエクスポートは、シェルからいつでも実行できることに注意してください.bashrc
。
DJANGO_SETTINGS_MODULE
Process Manager を使用した設定環境を設定するブートストラップ スクリプトを作成するのが苦手な場合 (そして、そのように感じる十分な理由があります!)、プロセス マネージャーを使用することをお勧めします。
environment
構成キーを使用して、環境変数を管理対象プロセスに渡すことができます。.env
) ファイルで環境変数を定義できます。最後に、変数を利用して、設定をまったく別の場所に保存できることに注意してくださいPYTHONPATH
(たとえば、運用サーバーでは、に保存します/etc/
)。これにより、構成をアプリケーション ファイルから分離できます。それは、アプリの構造によって異なります。
デフォルトではプロダクション設定を使用しますが、ファイルとsettings_dev.py
同じフォルダーに呼び出されるファイルを作成しsettings.py
ます。などのオーバーライドをそこに追加しますDEBUG=True
。
開発に使用するコンピューターで、これを~/.bashrc
ファイルに追加します。
export DJANGO_DEVELOPMENT=true
ファイルの最後にsettings.py
、次を追加します。
# Override production variables if DJANGO_DEVELOPMENT env variable is set
if os.environ.get('DJANGO_DEVELOPMENT'):
from settings_dev import * # or specific overrides
(通常、Python ではインポート*
を避けるべきであることに注意してください)
デフォルトでは、本番サーバーは何もオーバーライドしません。終わり!
他の回答と比較して、これは更新を必要としないため、または一度に1つのdjangoプロジェクトでのみ作業できるPYTHONPATH
設定を必要としないため、より単純です。DJANGO_SETTINGS_MODULE
私は通常、環境ごとに1つの設定ファイルと、共有設定ファイルを持っています。
/myproject/
settings.production.py
settings.development.py
shared_settings.py
私の各環境ファイルには次のものがあります。
try:
from shared_settings import *
except ImportError:
pass
これにより、必要に応じて共有設定を上書きできます(そのスタンザの下に変更を追加することにより)。
次に、settings.pyにリンクして、使用する設定ファイルを選択します。
ln -s settings.development.py settings.py
これは、6つの簡単なステップで行う方法です。
プロジェクト ディレクトリ内にフォルダーを作成し、名前を付けますsettings
。
プロジェクトの構造:
myproject/
myapp1/
myapp2/
myproject/
settings/
settings
ディレクトリ内__init__.py
にbase.py
、、、dev.py
および4 つの python ファイルを作成します。prod.py
設定ファイル:
settings/
__init__.py
base.py
prod.py
dev.py
開い__init__.py
て、次の内容を入力します。
初期化.py:
from .base import *
# you need to set "myproject = 'prod'" as an environment variable
# in your OS (on which your website is hosted)
if os.environ['myproject'] == 'prod':
from .prod import *
else:
from .dev import *
開いbase.py
て、すべての一般的な設定 (本番環境と開発環境の両方で使用されます) を入力します。次に例を示します。
base.py:
import os
...
INSTALLED_APPS = [...]
MIDDLEWARE = [...]
TEMPLATES = [{...}]
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
MEDIA_URL = '/path/'
dev.py
たとえば、開発固有のものを開いて含めます。
dev.py:
DEBUG = True
ALLOWED_HOSTS = ['localhost']
...
prod.py
たとえば、本番固有のものを開いて含めます。
prod.py:
DEBUG = False
ALLOWED_HOSTS = ['www.example.com']
LOGGING = [...]
...
(ANDRESMA のコメントによる)最後に別のパスを追加して、更新されたパスを反映するようにファイルを更新BASE_DIR
します。例えば:base.py
.parent
base.py:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
複数のsettings*.py
ファイルを作成し、環境ごとに変更する必要がある変数を推定します。次に、マスターsettings.py
ファイルの最後に:
try:
from settings_dev import *
except ImportError:
pass
settings_*
ステージごとに個別のファイルを保持します。
ファイルの先頭に、settings_dev.py
これを追加します。
import sys
globals().update(vars(sys.modules['settings']))
変更が必要な変数をインポートするには。
このwiki エントリには、設定を分割する方法に関するアイデアがさらにあります。
これは私のソリューションであり、開発、テスト、および本番用に異なる環境があります
import socket
[...]
DEV_PC = 'PC059'
host_name = socket.gethostname()
if host_name == DEV_PC:
#do something
pass
elif [...]