diadia

興味があることをやってみる。自分のメモを残しておきます。

製品用と開発用にsettings.pyを分けると便利

settings.pyを製品用と開発用に分ける理由

製品用と開発用にsettings.pyを使い分けると便利になる。それは製品と開発環境で作業を行き来する際に有用なのだ。開発環境では例えばsettings.pyのDEBUGをTrueに変更しなければならない。製品ではFalseに戻さなければならない。それは面倒だし、この変更中に記述ミスしてしまったら、バグ解消に時間がかかってしまう。そこで予め本番用の環境と開発用の環境を分けておくことでsettings.pyの編集を省ける。これが有用な理由だ。ちなみに以下が本番と開発間の変更すべき項目である。

DEBUG =   # FalseまたはTrue
DATABASES = {} #sqlit3または任意の
ALLOWED_HOSTS 
staticやmedia関係の設定

やり方

環境

  • python3.6
  • django2.1
  • nginxを使用
  • postgresqlを使用
  • gunicornを使用

運用イメージ

デフォルトのsettings.pyを本番環境用として使用する。local_settings.pyを開発環境用として使用する。そして製品環境、開発環境で以下のコマンドを使い分ける。

# 製品環境(デプロイ)
$ python manage.py runserver

# 開発環境 DJANGO_SETTINGS_MODULEを指定してrunserver
$ python manage.py runserver --settings config.local_settings

config/local_settingsと入力するとエラーが出るし、config.local_settings.pyでもエラーが出てしまうので注意する。

ファイルの作り方

settings.pyの内容をlocal_settings.pyにコピーする。本番用のsettings.pyにおいて以下の項目を製品環境設定に変更する。

#オリジナルのsettings.pyがあるディレクトリにてlocal_settings.py を作成
# 例えば以下のように

cd config
touch local_settings.py 

settings.pyの内容をコピーして上記で作成したlocal_settings.pyに貼り付ける。そしてコピー元のsettings.pyの内容を変更する。

DEBUG = False
# 自分の場合はpostgresqlを使う
DATABASES = {
    'default': {
        'ENGINE'   : 'django.db.backends.postgresql',
        'NAME'     : "project", #postgresqlで作成したデータベース名(この場合だとCREATE DATABASE project ;)
        'USER'     : "*****",
        "PASSWORD" : "*****",
        "HOST"     : "localhost",
        "PORT"     : "5432",
    }
}

ALLOWED_HOSTS = ['*.*.*.*'] #サーバーのIPを入力
STATIC_URL = '/static/'
STATIC_ROOT = '/usr/share/nginx/html/static' 
#↑ css,オブジェクトに紐付けられない画像,javascriptなどを配信するルートディレクトリ
MEDIA_URL = '/media/'
MEDIA_ROOT = '/usr/share/nginx/html/media' 
#↑ オブジェクトに紐付けられる画像を配信するルートディレクトリ
STATICFILES_DIR = [os.path.join(BASE_DIR, 'static')]

現状のsettings.pyの分け方について

前提:
開発環境ではwindowsまたはmacosを使用して開発を行い、製品環境ではLinux(Centos7)を使用する。
gunicorn
djando==2.2

背景

settings.pyを分けると、開発環境または製品環境どちらかでオプションをつけたコマンドを入力することが必要になる。例えば開発環境でオプションを付け開ければいけない時には

python manage.py runserver --setting config.dev_settings

と入力するし、製品環境でオプションを付ける場合には、

gunicorn --bind 127.0.0.1:8000 config.wsgi:application --env DJANGO_SETTING_MODULE=config.prod_settings

の用な感じで入力しなければならない。これをシンプルなコマンドにできればいいと思っていた。最終的に以下のコマンドを入力するだけで済むようになった。

python manage.py runserver
gunicorn --bind 127.0.0.1:8000 config.wsgi:application

やり方

platformモジュールを採用する。settings.pyを共通事項を記述したbase.pyと開発環境の設定を担当するprod_settings.pyと製品環境の設定えお担当するprod_settings.pyを準備する。
まずbase.pyをランサーバーコマンドまたはグニコーンコマンドが実行されたときに読み込みに行かせる。当該各コマンドが実行されたときにはDJANGO_SETTINGS_MODULEの値がsettings.pyの読み込み先となっている。そしてDJANGO_SETTINGS_MODULEはmanage.pyの中で設定している。したがってmanage.pyの中でconfig.baseを記述する。

baseでは共通の設定事項を記述する他、platformを判断させる。もしwindowsまたはmacosならば、開発環境のsettings.pyをインポートさせる。そしてLinuxならば製品環境のsettings.pyをインポートさせる。

 

また現状としてはconfig.wsgiファイルはprod_settings.pyを使うように変更している。これがどう影響するのかまだはっきりわかっていない。