🤖

# 4.10 Django 設定の実際(CORS・認証・メール・ログなど)

に公開

これまでの記事ではポイントごとに設定を分けて紹介してきたが、
実際の業務システムでは ひとつの settings.py に多様な設定をまとめる必要がある
ここでは「実運用でよく使う設定」を整理しておく。


1. .env 読み込み

Django は標準で .env を自動読み込みしないため、python-dotenv を使う。

pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()

これで .env に書いた値を os.getenv("XXX") で参照できる。

👉 実務では .env の置き場所が環境ごとに異なることも多いため、
複数パスを順に探す処理を入れておくと便利。


2. 認証・ログイン設定

Okta 連携(OIDC)

INSTALLED_APPS = [
    ...
    "allauth",
    "allauth.account",
    "allauth.socialaccount",
    "allauth.socialaccount.providers.okta",
]

AUTHENTICATION_BACKENDS = (
    "allauth.account.auth_backends.AuthenticationBackend",
    "django.contrib.auth.backends.ModelBackend",
)

SOCIALACCOUNT_PROVIDERS = {
    "okta": {
        "SCOPE": ["openid", "email", "profile"],
        "AUTH_PARAMS": {"response_type": "code"},
        "OKTA_BASE_URL": os.getenv("OKTA_BASE_URL"),
        "OAUTH_PKCE_ENABLED": True,
        "client_id": os.getenv("OKTA_CLIENT_ID"),
        "SECRET": os.getenv("OKTA_CLIENT_SECRET"),
        "redirect_uri": os.getenv("OKTA_REDIRECT_URI"),
    }
}

👉 Okta 管理画面では OpenID Connect を選び、リダイレクトURIを設定する。


3. CORS と CSRF

Vue 側から Cookie を送る場合は以下の設定が必須。

CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:5173",
    "http://127.0.0.1:5173",
    "https://example.com",
]

CSRF_TRUSTED_ORIGINS = [
    "http://localhost:5173",
    "https://example.com",
]

💡 豆知識(CORSとは?)
Vue (localhost:5173) → Django (localhost:8000) の通信は「オリジンが異なる」ため、ブラウザはデフォルトでブロックする。
Django 側で CORS_ALLOWED_ORIGINS を設定することで「このフロントからの通信は許可」と宣言できる。


4. メール設定

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
DEFAULT_FROM_EMAIL = os.getenv("EMAIL_FROM")
EMAIL_HOST = os.getenv("EMAIL_HOST")
EMAIL_PORT = int(os.getenv("EMAIL_PORT", 587))
EMAIL_USE_TLS = os.getenv("EMAIL_USE_TLS", "True") == "True"
EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD")

👉 パスワードリセットや通知メールで必須。


5. データベース(複数DB対応)

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.getenv("DEFAULT_NAME"),
        "USER": os.getenv("DEFAULT_USER"),
        "PASSWORD": os.getenv("DEFAULT_PASSWORD"),
        "HOST": os.getenv("DEFAULT_HOST"),
        "OPTIONS": {"driver": "ODBC Driver 17 for SQL Server"},
    },
    "analytics_db": {
        "ENGINE": "mssql",
        "NAME": os.getenv("ANALYTICS_DB_NAME"),
        ...
    },
}

6. ログ出力(RotatingFileHandler)

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "file": {
            "class": "logging.handlers.RotatingFileHandler",
            "filename": BASE_DIR / "logs" / "django.log",
            "maxBytes": 10 * 1024 * 1024,
            "backupCount": 20,
            "formatter": "verbose",
        },
    },
    "loggers": {
        "django": {"handlers": ["file"], "level": "INFO"},
    },
    "formatters": {
        "verbose": {
            "format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
        }
    },
}

👉 大量ログが肥大化しないよう、ローテーションを入れておくのが実務必須。


7. タイムゾーン設定

TIME_ZONE = "Asia/Tokyo"
USE_I18N = True
USE_TZ = True
  • USE_TZ=True にすると、DBには UTC で保存される
  • 日本時間だと「9時間ずれる」ように見えるのはそのため
  • 表示時に Asia/Tokyo が適用され、ユーザーには正しい時刻が見える

👉 業務システムでは USE_TZ=True が推奨
将来的に海外展開や時差対応が必要になったときに柔軟に切り替えられる。


8. ファイルアップロード制限

FILE_UPLOAD_MAX_MEMORY_SIZE = 30 * 1024 * 1024
DATA_UPLOAD_MAX_MEMORY_SIZE = 30 * 1024 * 1024
  • メモリ上で処理できるアップロードサイズを制限(ここでは30MB)
  • これ以上のファイルは一時ファイルとしてディスクに退避
  • 不要に大きなファイルでサーバーが止まらないようにする安全策

👉 実務では業務要件に合わせて「Excelは最大10MB」「画像は最大30MB」など調整する。


まとめ

  • .env 管理 … 環境差分をコードに埋め込まない
  • Okta + OIDC … 統合認証に対応
  • CORS / CSRF 設定 … SPA 連携の必須ポイント
  • メール / DB / ログ / ファイル制限 … 実務システムで欠かせない
  • タイムゾーン … UTC 保存 + Asia/Tokyo 表示が基本

Discussion