メモ帳

python, juliaで機械学習をやっていく

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

github.com

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することさえ忘れなければ一定の安全は保たれると思います。