概要
ImproperlyConfigured は、Djangoの設定ファイル(settings.py)に問題がある場合に発生するエラーです。必須設定の欠落、不正な値、環境変数の未設定などが原因です。
エラーメッセージ
django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured.
django.core.exceptions.ImproperlyConfigured: WSGI application 'myproject.wsgi.application' could not be loaded
原因
- SECRET_KEY未設定: 本番環境でSECRET_KEYが空
- データベース設定不備: 接続情報が間違っている
- INSTALLED_APPSの問題: アプリが正しく登録されていない
- 環境変数未設定: 必要な環境変数が設定されていない
- DJANGO_SETTINGS_MODULE未設定: 設定モジュールが指定されていない
解決策
1. SECRET_KEYを設定
開発環境(settings.py):
1
| SECRET_KEY = 'your-secret-key-here'
|
本番環境(環境変数から取得):
1
2
3
4
5
| import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
if not SECRET_KEY:
raise ImproperlyConfigured('Set the DJANGO_SECRET_KEY environment variable')
|
SECRET_KEYを生成:
1
2
| from django.core.management.utils import get_random_secret_key
print(get_random_secret_key())
|
または:
1
| python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
2. データベース設定を確認
1
2
3
4
5
6
7
8
9
10
| DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME', 'mydb'),
'USER': os.environ.get('DB_USER', 'myuser'),
'PASSWORD': os.environ.get('DB_PASSWORD', ''),
'HOST': os.environ.get('DB_HOST', 'localhost'),
'PORT': os.environ.get('DB_PORT', '5432'),
}
}
|
SQLiteの場合:
1
2
3
4
5
6
| DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
|
3. INSTALLED_APPSを確認
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# サードパーティ
'rest_framework',
'corsheaders',
# 自作アプリ(apps.pyのnameと一致させる)
'myapp.apps.MyappConfig',
# または
'myapp',
]
|
apps.py:
1
2
3
4
5
| from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp' # INSTALLED_APPSと一致させる
|
4. 環境変数を設定
.envファイル:
1
2
3
4
5
| DJANGO_SECRET_KEY=your-secret-key
DJANGO_DEBUG=True
DB_NAME=mydb
DB_USER=myuser
DB_PASSWORD=mypassword
|
settings.py(python-dotenv使用):
1
2
3
4
5
6
7
| from dotenv import load_dotenv
import os
load_dotenv()
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
DEBUG = os.getenv('DJANGO_DEBUG', 'False') == 'True'
|
5. DJANGO_SETTINGS_MODULEを設定
manage.py:
1
| os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
|
wsgi.py:
1
2
3
4
| os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
|
環境変数で設定:
1
| export DJANGO_SETTINGS_MODULE=myproject.settings
|
6. ALLOWED_HOSTSを設定
1
2
3
4
5
6
7
8
| # 開発環境
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# 本番環境
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')
# またはワイルドカード(開発のみ)
ALLOWED_HOSTS = ['*']
|
1
2
3
4
5
6
7
8
9
10
| # 静的ファイル
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# メディアファイル
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
|
8. 設定ファイルの分割(環境別)
myproject/
├── settings/
│ ├── __init__.py
│ ├── base.py # 共通設定
│ ├── local.py # 開発環境
│ └── production.py # 本番環境
base.py:
1
2
3
4
5
6
| from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
INSTALLED_APPS = [...]
MIDDLEWARE = [...]
|
local.py:
1
2
3
4
5
6
7
8
9
10
| from .base import *
DEBUG = True
SECRET_KEY = 'dev-secret-key'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
|
production.py:
1
2
3
4
5
6
| from .base import *
import os
DEBUG = False
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')
|
使用方法:
1
2
3
4
5
| # 開発環境
export DJANGO_SETTINGS_MODULE=myproject.settings.local
# 本番環境
export DJANGO_SETTINGS_MODULE=myproject.settings.production
|
デバッグ方法
1
2
3
4
5
6
7
8
9
10
11
| # 設定を確認
python manage.py check
# シェルで設定を確認
python manage.py shell
>>> from django.conf import settings
>>> print(settings.SECRET_KEY)
>>> print(settings.DATABASES)
# 設定を表示(diffsettingsコマンド)
python manage.py diffsettings
|