Djangoの環境設定・運用まとめ。settings.pyの環境別分割・メール送信・データのエクスポート/インポート

Djangoの環境設定・運用まとめ。settings.pyの環境別分割・メール送信・データのエクスポート/インポート

Djangoアプリの運用まわりでよく使う設定を、この記事1本にまとめて解説します。

  1. settings.pyの環境別分割(本番・開発・ローカル)
  2. メール送信の設定(SMTP / consoleバックエンド)
  3. データのエクスポート/インポート(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_DIR
  • INSTALLED_APPS
  • MIDDLEWARE
  • ROOT_URLCONF
  • TEMPLATES
  • その他ライブラリの共通設定

階層が1つ深くなるため、BASE_DIR の修正を忘れないでください。

# 修正前
BASE_DIR = Path(__file__).resolve().parent.parent
# 修正後
BASE_DIR = Path(__file__).resolve().parent.parent.parent

ローカル・開発環境用の設定(local.py / development.py)

環境ごとに使い分ける設定値を書きます。

  • SECRET_KEY
  • DEBUG = True
  • ALLOWED_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開発の基本操作まとめを参考にしてください。

技術ブログ一覧へ戻る