【django】開発・本番環境用にsettings.pyを分割

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

djangoの設定ファイルのsettings.pyを分割する方法を記載します。

目次

初期設定

お決まりのパターンで初期設定を行います。

django-admin startproject config .

settingsディレクトリの作成

settings.pyがある階層でsettingsディレクトリを作成します。

その後、settingsディレクトリに

  • base.py
  • local.py
  • production.py

をそれぞれ作成します。

base.pysettings.pyをもとにしたファイルです。

各ファイルの作成

ファイルを修正していきます。ここでは

  • settings
    • base.py
    • local.py
    • production.py
  • manage.py
  • wsgi.py

を修正します。

base.pyの修正

base.pyではBASE_DIR の階層を変更します。
settingsディレクトリを作成して階層が深くなったからです。

末尾にparentを追加します。

- BASE_DIR = Path(__file__).resolve().parent.parent
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent

次に、それぞれのファイルを記述します。
from .base import *base.pyの設定をインポートしています。

local.pyの作成

まずはlocal.pyで開発環境用の設定を行います。

下記では一例として、ローカルだけ追加したいパッケージやデータベースの設定を行っています。

from .base import *

ALLOWED_HOSTS = ['*']

INSTALLED_APPS += [
    'debug_toolbar',
]

MIDDLEWARE += [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'django',
        'USER': 'admin',
        'PASSWORD': 'admin',
        'PORT': '5433'
    }
}

INTERNAL_IPS = ['127.0.0.1']

django-debug-toolbarは開発環境でよく使うので記載しました。

使用するには

pip install django-debug-toolbar

でインストールします。

production.pyの作成

ここでは、本番環境用の設定を記述します。

from .base import *

ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')

DATABASES = {
    'default': {
        'ENGINE': env('DB_ENGINE'),
        'NAME': env('DB_NAME'),
        'USER': env('DB_USER'),
        'PASSWORD': env('DB_PASSWORD'),
        'PORT': env('DB_PORT')
    }
}

STATIC_ROOT = '/usr/share/nginx/html/static'
MEDIA_ROOT = '/usr/share/nginx/html/media'

データベースは、django-environを使用して.envファイルを作成しています。

ホスト設定とデータベースを環境変数で設定しておき、nginxから配信する静的ファイルの配信位置を指定しています。

manage.pyの修正

manage.pyos.environ.setdefault()を修正します。

- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')

全文になります。

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

wsgi.pyの修正

manage.pyと同様に修正します。

- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')

修正は以上になります。

開発用サーバーの起動

python manage.py runserver

で起動できたら完了です。
また、設定ファイルを切り替えたい場合には

python manage.py runserver --setting config.settings.production

のように引数--settingsで切替可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次