Django の settings を切り替えるようにした話

More than 1 year has passed since last update.


はじめに

Django で web アプリを作ってるんですけど、

heroku で本番環境やステージングで動作を変更したいときってあると思います。

そういうときは、settings ファイルを環境に合わせて作りましょー。

※ Django は 1.10.7 を使ってます。


project を作ると

こんな感じになると思います。

1.png

通常は、上記の mysite/settings.py を読み込みます。


別の settings を作ってみる

仮に、settings をこんな感じに分けたとします。

2.png

このまま python manage.py runserver するとエラーになるので、読み込み先を変えましょう。


どこを変えるのか

ずばり、manage.py と wsgi.py です。

3.png


具体的に

この2ファイルには、それぞれ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") と書かれている箇所があります。

これが settings の読み込み先になります。


manage.py

#!/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)



wsgi.py


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") と書き換えます。


manage.py

#!/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)



wsgi.py


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 !!