もた日記

くだらないことを真面目にやる

Djangoメモ : python-decouple, django-environで設定情報を管理

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にプロジェクトの設定情報を管理してみる。


python-decouple

Djangoのsettings.pyに書いてある設定情報にはSECRET_KEYやパスワード、環境に依存する設定などが含まれているのでハードコードするのは望ましくない。
この問題を解決するためにチュートリアルではpython-decoupleを紹介している。

github.com

インストール

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をマージしたパッケージとのこと。

github.com

インストール

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などを使うと管理しやすい