DjangoのDatabase定義をpython-decoupleを使って環境変数のように扱う
Djangoのコードをgithubなどにuploadするときに、DB定義などのセンシティブな情報を隠す方法をまとめます。
versions
requirements.txt
dj_database_url python-decouple
python-decouple
iniファイルや.envファイルから設定を読み込み、適切なデータ型に変換する。 環境変数から設定を読み込むときには、以下のように一律でstring型になってしまう。 しかし、python-decoupleを使って呼び出すと、DEBUG変数はbooleanとなり、SECRET_KEYはstringになる。
# 環境変数の呼び出し import os DEBUG = os.environ("DEBUG") # >> str SECRET_KEY = config('SECRET_KEY') # >> str # python-decoupleで呼び出し from decouple import config DEBUG = config('DEBUG') # >> bool SECRET_KEY = config('SECRET_KEY') # >> str
dj_database_url
DjangoのDatabase定義は以下のように記述する
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myappdb', 'USER': 'myappuser', 'PASSWORD': 'myapppass', 'HOST': 'db', 'PORT': '3306', } }
一方でdj_database_urlは、string表現をparseし、DBを定義します。
from decouple import config DATABASES = { 'default': dj_database_url.config( default="mysql://myappuser:myapppass@db:3306/myappdb" )
主に、string表現のformatは、以下のようになっています。
mysql://[user name]:[user password]@[host]:[port]/[table name]
MySQL以外だけでなく、ほとんどのDatabaseをサポートしています。 github.com
Databaseの定義を環境変数化する
以上を踏まえてDatabase定義をsettings.pyから切り離して環境変数化していきます。なお、あくまでも設定ファイルから呼び込むので正確には環境変数ではありません。
設定ファイルを書く
settings.iniにstring形式のDatabase定義を書き込む。 忘れずに.gitignoreにsettings.iniを追加する。
(settings.ini) [settings] DATABASE_URL=mysql://myappuser:myapppass@db:3306/myappdb
(.gitignore) ... settings.ini
DB定義
settings.iniにstring表現でdatabaseを定義するしたものを、python-decoupleで読み込み、dj_database_urlでstring表現をparseし、DBを定義する。 ただし、optionsは直接代入する必要がある。
DATABASES = { 'default': dj_database_url.config( default=config('DATABASE_URL', default="sqlite:///db.sqlite3") ) } DATABASES["default"]["OPTIONS"] = { 'charset': 'utf8mb4' }
djagnoでDB情報を確認する
$ python manage.py shell # activate shell >>> from django import db >>> db.connections.databases
user, password, hostなどが正しい値になっていれば設定完了です。
このように読み込めばコード上にsensitiveな情報が残らないのでsettings.iniをgitignoreすることさえ忘れなければ一定の安全は保たれると思います。