11.

Django settings.py の定数にアクセス|from django.conf import settings

編集
この記事の要点
  • Django で settings.py の定数(環境変数等)にアクセスする方法
  • import: from django.conf import settings
  • 取得: settings.SECRET_KEY のように属性アクセス
  • 実行時の値変更を避けるため、settings は読み取り専用として扱う
  • カスタム定数も同じ方法で参照可能(大文字推奨)

基本: from django.conf import settings

Django のアプリ内から settings.py の値を参照する標準的な方法:

from django.conf import settings
from django.views.generic import View

class TestView(View):
    def get(self, request):
        # 標準設定
        secret = settings.SECRET_KEY
        debug = settings.DEBUG
        timezone = settings.TIME_ZONE

        # カスタム定数(settings.py に書いたもの)
        api_key = settings.MY_API_KEY
        max_users = settings.MAX_USERS

        return JsonResponse({
            'debug': debug,
            'timezone': timezone,
        })

settings.py のカスタム定数

# myproject/settings.py

import os
from pathlib import Path

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

# 標準的な Django 設定
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key')
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')

# カスタム定数(命名規則: 大文字 + アンダースコア)
MY_API_KEY = os.environ.get('MY_API_KEY', '')
MAX_USERS = int(os.environ.get('MAX_USERS', 100))
PAYMENT_PROVIDER = 'stripe'
EMAIL_SENDER_NAME = 'My Service'

# 辞書形式の定数
PRICING = {
    'basic': 1000,
    'premium': 5000,
}

環境変数経由が推奨

機密情報・環境ごとに変わる値は環境変数経由で読むのが定石:

# settings.py
import os

# シンプルな環境変数
SECRET_KEY = os.environ['SECRET_KEY']  # 必須(未設定で例外)

# デフォルト値付き
DEBUG = os.environ.get('DEBUG', 'False') == 'True'

# python-dotenv で .env 読み込み(推奨)
from dotenv import load_dotenv
load_dotenv()

# django-environ で型付き取り出し(更に推奨)
import environ
env = environ.Env(DEBUG=(bool, False))
environ.Env.read_env(BASE_DIR / '.env')

SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
DATABASE_URL = env.db('DATABASE_URL')  # 自動で DATABASES dict に変換
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[])
MAX_USERS = env.int('MAX_USERS', default=100)

環境別 settings の分割

開発・ステージング・本番で設定が大きく変わる場合、settings をモジュール分割します:

# myproject/settings/__init__.py
# 環境変数 DJANGO_SETTINGS_MODULE で切替

# myproject/settings/base.py - 共通設定
SECRET_KEY = ...
INSTALLED_APPS = [...]

# myproject/settings/dev.py - 開発
from .base import *
DEBUG = True
DATABASES = {'default': {'ENGINE': 'sqlite3', ...}}

# myproject/settings/prod.py - 本番
from .base import *
DEBUG = False
DATABASES = {'default': {'ENGINE': 'postgresql', ...}}

# manage.py や wsgi.py で
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.prod')

テンプレートからの参照

Django テンプレートで settings の値を使うには context_processor を経由:

# myapp/context_processors.py
from django.conf import settings

def site_settings(request):
    return {
        'SITE_NAME': settings.SITE_NAME,
        'SUPPORT_EMAIL': settings.SUPPORT_EMAIL,
        'DEBUG': settings.DEBUG,
    }

# settings.py の TEMPLATES に追加
TEMPLATES = [
    {
        ...,
        'OPTIONS': {
            'context_processors': [
                ...,
                'myapp.context_processors.site_settings',  # ★ 追加
            ],
        },
    },
]
{# テンプレートで参照可能に #}
{{ SITE_NAME }} - About

サポート: {{ SUPPORT_EMAIL }}

{% if DEBUG %}
開発環境
{% endif %}

テスト時の settings 上書き

from django.test import TestCase, override_settings

class MyTest(TestCase):
    @override_settings(MY_API_KEY='test-key', DEBUG=True)
    def test_something(self):
        from django.conf import settings
        self.assertEqual(settings.MY_API_KEY, 'test-key')
        # この test 内だけ MY_API_KEY が上書きされる

# クラス全体に適用
@override_settings(DEBUG=True)
class AllTests(TestCase):
    ...

実行時に settings を読み込む / 変更する

動作中の settings 値を変更してはいけない(read-only 設計):

# ❌ NG: 実行時に書き換える
settings.MY_API_KEY = 'new-value'  # 副作用が予測できなくなる

# ✅ OK: settings は読み取り専用、別の状態管理を使う
# - DB の Settings モデル
# - Cache (Redis) に保存
# - 環境変数 + プロセス再起動

関連

  • django-environ: 環境変数を型付きで読む推奨パッケージ
  • python-dotenv: .env ファイル読み込み
  • django-constance: 管理画面から動的に設定を変更できる
  • django-configurations: クラスベースの settings 分割
  • 本番でのデバッグ情報露出禁止: DEBUG=False でないと SECRET_KEY 等が漏れる
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成