Djangoの環境設定・運用まとめ。settings.pyの環境別分割・メール送信・データのエクスポート/インポート
Djangoアプリの運用まわりでよく使う設定を、この記事1本にまとめて解説します。
- settings.pyの環境別分割(本番・開発・ローカル)
- メール送信の設定(SMTP / consoleバックエンド)
- データのエクスポート/インポート(dumpdata / loaddata)
1. settings.pyを環境ごとに分割する
DB接続先、静的ファイルの配置先、SECRET_KEYなどを環境ごとに分けることで、デプロイ時のミスやエラーを防げます。
方針
- 本番・開発・ローカル環境ごとに切り替えられるようsettingsを分割する
- 起動時に環境変数
DJANGO_SETTINGS_MODULEまたは--settingsオプションで切り替える
ファイル・ディレクトリ構成
settings.py を削除し、settings ディレクトリを作成します。
project/
├ __init__.py
├ asgi.py
├ urls.py
├ wsgi.py
└ settings/
├ __init__.py
├ base.py # 共通設定ファイル
├ local.py # ローカル環境固有
├ development.py # 開発環境固有
└ production.py # 本番環境固有
base.pyに書く設定値
全環境で使い回す設定を base.py に書きます。
BASE_DIRINSTALLED_APPSMIDDLEWAREROOT_URLCONFTEMPLATES- その他ライブラリの共通設定
階層が1つ深くなるため、BASE_DIR の修正を忘れないでください。
# 修正前
BASE_DIR = Path(__file__).resolve().parent.parent
# 修正後
BASE_DIR = Path(__file__).resolve().parent.parent.parent
ローカル・開発環境用の設定(local.py / development.py)
環境ごとに使い分ける設定値を書きます。
SECRET_KEYDEBUG = TrueALLOWED_HOSTS = ['IPアドレス', 'ホスト名']DATABASES
ローカル・開発環境にはデバッグ用アプリの debug_toolbar を入れておくのがおすすめです。
from .base import *
INSTALLED_APPS += [
"debug_toolbar",
]
本番環境用の設定(production.py)
SECRET_KEY— 他の環境と重複させないことが重要DEBUG = False— Trueのままだとエラー時にデバッグ情報が表示され、セキュリティリスクになるALLOWED_HOSTS— 実ホスト名を列挙するDATABASES
manage.py / wsgi.py / asgi.pyの修正
デフォルトでローカル環境の設定を読み込むようにします。環境変数や --settings の指定がない場合はローカル環境として起動されます。
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.local')
開発・本番環境での起動
切り替えは2通りあります。環境変数を設定する場合:
export DJANGO_SETTINGS_MODULE=project.settings.production
python manage.py runserver 0.0.0.0:80
--settings オプションを使う場合:
python manage.py runserver --settings=project.settings.production 0.0.0.0:80
.env ファイルなどに DJANGO_SETTINGS_MODULE を設定しておき、起動スクリプトから読み込む方法がおすすめです。
2. メール送信の設定
SMTPで実際に送信する場合
settings.py(分割している場合は環境別ファイル)に追記します。
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.mailserver.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'administrator'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_HOST_USERとEMAIL_HOST_PASSWORDをベタ書きしたままgit pushするとセキュリティインシデントになります。 OSの環境変数から読み込む形にしましょう。
import os
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = os.environ.get('EMAIL_HOST', 'localhost')
EMAIL_PORT = os.environ.get('EMAIL_PORT', '587')
EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', '')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', '')
consoleバックエンドで確認する場合
consoleバックエンドは、メールを実際には送らずコンソールに内容を表示してくれる設定です。ローカル開発での動作確認に便利です。
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
メールの送信
from django.core.mail import send_mail
subject = "メール題名"
message = "これはテストメールです"
from_email = "noreply@sample.com"
recipient_list = [
"sample@example.com",
]
send_mail(subject, message, from_email, recipient_list)
サインアップ時のメールアドレス検証に使う方法はdjango-allauth入門ガイドを参照してください。
3. データのエクスポート/インポート:dumpdata / loaddata
環境間のデータ移行やテストデータ(fixture)の作成に使います。
dumpdataでエクスポート
アプリ全体をエクスポート:
python manage.py dumpdata polls > polls/fixtures/dumpdata.json
特定のModelだけエクスポート:
python manage.py dumpdata polls.Question > polls/fixtures/dumpdata_Question.json
loaddataでインポート
python manage.py loaddata polls/fixtures/dumpdata.json
まとめ
| やりたいこと | 方法 |
|---|---|
| 環境別の設定切り替え | settings/ に分割し DJANGO_SETTINGS_MODULE で指定 |
| 本番のセキュリティ | DEBUG = False・SECRET_KEYの分離・認証情報は環境変数 |
| メール送信 | SMTPバックエンド(本番)/ consoleバックエンド(開発) |
| データ移行 | dumpdata でエクスポート → loaddata でインポート |
開発の基本操作はDjango開発の基本操作まとめを参考にしてください。