Djangoメモ : python-decouple, django-environで設定情報を管理
A Complete Beginner's Guide to Djangoのチュートリアルを参考にプロジェクトの設定情報を管理してみる。
python-decouple
Djangoのsettings.py
に書いてある設定情報にはSECRET_KEY
やパスワード、環境に依存する設定などが含まれているのでハードコードするのは望ましくない。
この問題を解決するためにチュートリアルではpython-decoupleを紹介している。
インストール
python-decoupleはpip
でインストールできる。
また、データベース接続情報を管理しやすくするdj-database-urlも併せてインストールする。
$ pip install python-decouple dj-database-url
今回はPipenvで環境を構築しているので下記コマンドを実行。
$ pipenv install python-decouple dj-database-url
使い方
python-decoupleを使用すると.env
ファイル(またはsettings.ini
)に設定情報を記述し、それをsettings.py
で読み込めるようになる。
ということでmanage.py
, db.sqlite3
があるディレクトリに以下の内容で.env
を作成する(SECRET_KEY
は各自の値で置き換えること)。
SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d DEBUG=True ALLOWED_HOSTS=.localhost,127.0.0.1,192.168.33.10 DATABASE_URL=sqlite:///db.sqlite3 EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
myproject/settings.py
ではパッケージをインポートしてconfig('SECRET_KEY')
のようにして値を読み込む。
config('DEBUG', default=False, cast=bool)
はデフォルト値およびデータ型を指定する方法で、config('ALLOWED_HOSTS', cast=Csv())
はCSV形式のデータを読み込む方法。
また、dj-database-urlを使用しているのでデータベース設定情報をsqlite:///db.sqlite3
のように1行で記述することができる(PostgreSQLの場合はpostgres://USER:PASSWORD@HOST:PORT/NAME
など)。
from decouple import config, Csv import dj_database_url SECRET_KEY = config('SECRET_KEY') DEBUG = config('DEBUG', default=False, cast=bool) ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv()) DATABASES = { 'default': dj_database_url.config( default=config('DATABASE_URL') ) } EMAIL_BACKEND= config('EMAIL_BACKEND')
このように.env
ファイルで設定情報を管理できるようになるので、Production環境では別の.env
ファイルを用意するなどして環境の切り替えも簡単にできる。
django-environ
python-decoupleでも問題はないが、Djangoプロジェクトの雛形を作成できるcookiecutter-djangoではdjango-envionというパッケージを使用しているのでこちらも試してみる。
django-environはenvparse, honcho, dj-database-url, dj-search-url, dj-config-url, django-cache-urlをマージしたパッケージとのこと。
インストール
django-environはpip
でインストールできる。
$ pip install django-environ
今回はPipenvで環境を構築しているので下記コマンドを実行。
$ pipenv install django-environ
使い方
django-environでも.env
ファイルから読み込めるので先ほどのファイルを再利用する。
最初に対話型シェルで試してみる。
>>> import environ >>> env = environ.Env(DEBUG=(bool, False),) # set default values and casting >>> environ.Env.read_env('.env') # reading .env file >>> env('DEBUG') True >>> env.list('ALLOWED_HOSTS') ['.localhost', '127.0.0.1', '192.168.33.10'] >>> env.db() {'NAME': 'db.sqlite3', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'ENGINE': 'django.db.backends.sqlite3'}
使い方はわかったのでmyproject/settings.py
を書き換える。
import environ env = environ.Env(DEBUG=(bool, False),) # set default values and casting environ.Env.read_env('.env') # reading .env file SECRET_KEY = env('SECRET_KEY') DEBUG = env('DEBUG') ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') DATABASES = { 'default': env.db(), } EMAIL_BACKEND = env('EMAIL_BACKEND')
これで.env
から設定情報が読み込めるようになる。django-environの方がいろいろなパッケージを含んでいるので使いやすいかも。
まとめ
- パスワード、環境に依存する設定情報はハードコードせずに設定ファイルで管理する
- python-decouple, django-environなどを使うと管理しやすい