はじめに
Django で web アプリを作ってるんですけど、
heroku で本番環境やステージングで動作を変更したいときってあると思います。
そういうときは、settings ファイルを環境に合わせて作りましょー。
※ Django は 1.10.7 を使ってます。
project を作ると
通常は、上記の mysite/settings.py を読み込みます。
別の settings を作ってみる
このまま python manage.py runserver
するとエラーになるので、読み込み先を変えましょう。
どこを変えるのか
具体的に
この2ファイルには、それぞれ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
と書かれている箇所があります。
これが settings の読み込み先になります。
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
これを、こうじゃ!
mac での開発は mysite/settings/local.py を読み込んでほしいので、これを os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")
と書き換えます。
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")
try:
from django.core.management import execute_from_command_line
except ImportError:
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")
application = get_wsgi_application()
本番環境などではどうするか
ここまで読んだ方はわかると思いますが、django の setting の読み込み先は、DJANGO_SETTINGS_MODULE という環境変数で変えることができます。
例えば heroku の場合、環境に合わせて config var を変更することで、読み込む settings を変えることができます。
こんな感じで。
heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings.production --app heroku_production
とても便利です。
おまけ
公式 doc にもありますが、runserver 時に settings を指定することもできます。
django-admin runserver --settings=mysite.settings.local
Have a good django life !!