Djangoでの"秘密にしたい値"の取り扱い

Gitで管理しながら、GitHubで公開したりHerokuにデプロイしたりする際の、"秘密にしたい値"の取り扱いのついて

はじめに

秘密にしたい値って案外多いと思います。
settings.pyのSECRET_KEYとか、API Keyとか。
ソースコードの中に埋めると丸見えになるので、対策してみました。

秘密にしたい値の取り扱い

秘密にしたい値をgitの管理対象外にして、herokuの環境変数に設定します。

githubでの取り扱い

まずはgitの管理対象から秘密にしたい値を外します。
settings_local.pyなどを用意して、そこに値を集めてみました。

settings_local.py

SECRET_KEY = 'hoge'

あとはsettings_local.pyをimportするだけです。

settings.py

import settings_local
SECRET_KEY = settings_local.SECRET_KEY

.gitignoreを用意して、管理対象外に指定するのを忘れないように。

.gitignore

settings_local.py

herokuでの取り扱い

まずは環境変数に指定します。

$ heroku config:add SECRET_KEY="hoge"

あとは、環境変数を利用するようにsettings.pyを調整します。

settings.py

from os import environ
SECRET_KEY = environ['SECRET_KEY']

設定を動的に切り替え

これで秘密にしたい値を秘密にできたので、後はローカル環境とheroku環境で動的に設定を切り替えるようにしておきます。

settings.py

from socket import gethostname
from os import environ

HOSTNAME = gethostname()

if 'local' in HOSTNAME:
    import settings_local
    SECRET_KEY = settings_local.SECRET_KEY
else
    SECRET_KEY = environ['SECRET_KEY']

settings_local.py

SECRET_KEY = 'hoge'

.gitignore

settings_local.py


注意
ifの条件文でHOSTNAMEに"local"が含まれている場合…としてますが、

$ hostname

で、ご利用のhostnameがわかるので自身の環境に合せて変更してください。

おわりに

"秘密にしたい値"ってなんて言うんですかね??
良い表現が思い付きませんでした…。

参考にしたページ