DjangoでWebアプリケーションを作成し、いざ本番環境に上げる際に設定は重要な要素です。
開発環境とは違い、重要な情報はなるべく秘匿したいですよね。
今回はそれに便利なDjangoパッケージであるdjango-environについて解説していきます。
【Django】django-environで環境変数を扱う
django-environは何をしてくれるのか
このパッケージの利点は大きく2つだと考えています。
- 環境変数を導入できる
- 開発と本番で設定の切り替えが容易になる
①環境変数を導入できる
Djangoの設定情報であるsettings.pyファイルの中身を、
環境変数として別ファイルで扱うことができます。
上記画像のように「.env」ファイルを参照してくれます。
settings.pyに重要な情報をハードコーディングする必要がなく、セキュリティが向上します。
②開発と本番で設定の切り替えが容易になる
Webアプリケーションを本番にアップロードする場合、Gitのような同期ツールを使用すると思います。
その際にも、django-environは威力を発揮します。
上記のように、開発用の.envファイルと本番用の.envファイルを用意しておけば、settings.pyファイルは同期することができます。
共通部分は同期できるので、管理の負担が減るのが良いですね。
django-environの利点が分かったところで、このパッケージを導入し、設定を行っていきましょう。
django-environを導入する
①pip経由でインストール
おなじみのpipを用いてインストールします。コマンドは以下の通りです。
開発、本番それぞれの環境でインストールが必要です。
②.envファイルを作成する
Djangoの実行ファイルである「manage.py」と同フォルダ内に配置してください。
ファイルの中には、秘匿したい情報を記載します。一例を示します。
1 2 3 |
SECRET_KEY=--省略-- DEBUG=True DATABASE_URL=postgresql://postgres:postgrespassword@db:5432/postgres |
また上記は開発用ですのでDEBUGはTrueにしてあります。本番ではFalseにしてください。
さて、DATABASE_URLですが、django-environはこの文字列を分解してDB情報を参照してくれます。
対応は以下の通りになっています。
それぞれ元のsettings.pyを参照すればDATABASE_URL作成は容易だと思います。
あとは開発と本番で異なる情報を記載していくと良いでしょう。
例えば、私は上記以外にも「ALLOWED_HOST」やURLが一部変更されるため「STATIC_URL」、「MEDIA_URL」などを記載しています。
また、ソースコードをGitで管理している場合は、この.envファイルは同期の対象外にするようにして下さい。
開発と本番でこのファイルだけは同じではないということです。
③settings.pyに参照を記載する
.envファイルが作成できたので、このファイルを参照するようにsettings.pyを修正しましょう。
以下のように変更できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from pathlib import Path import os import environ # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = --省略-- #.envファイル読み込み env = environ.Env() env.read_env('.env') #.envファイルを参照 SECRET_KEY = env('SECRET_KEY') DEBUG = env('DEBUG') DATABASES = { 'default': env.db() } |
あとは簡単で、.envファイルを読み込むようにして、それぞれの設定値に.envのファイルで使用した環境変数名を宛がっています。
DATABASESのみ少し注意が必要で、「db()」をつけることでDATABASE_URLの文字列をdjango-environが分解してくれます。
書き方さえ合っていれば環境変数はいくつでも指定可能です。私はALLOWED_HOSTやSTATIC_URLなども参照するようにしています。
おわりに
Djangoには便利なパッケージが多く、このdjango-environも外せない一つですね。
セキュリティも向上し、管理も楽になるなら、導入しない理由はないとも言えます。
Webアプリケーション開発をしている方は、ぜひとも導入を検討してみてください!