Django
Heroku
python3

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

はじめに

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