Djangoを使用した場合の環境変数等の設定についての記事。
私は以前Javaの開発業務をしていました。Javaでは環境変数等はSystem.propertiesで管理するのが大半かと思います。
django-environを使用すればSystem.propertiesのように設定値を扱えそうなためまとめてみました。
JavaのSystem.propertiesにはソースにハードコーティングしたくないような値や書き換えて設定を簡単に変えたい値を指定します。
例:外部ソースアクセス時に使用するシークレットキーなどの非公開にすべき値、ダウンロードファイルの格納先となるファイルパス、文字コード、拡張子等
前提条件
Python 3.10
Django 4.0.2
pip 22.0.2
Windows環境
環境変数の設定
仮今回はDjango-environを使用して環境変数を設定します。想環境が起動していることを確認して次のpipコマンドを実行。
(venv) $ pip install django-environ
Collecting django-environ
Downloading django_environ-0.8.1-py2.py3-none-any.whl (17 kB)
Installing collected packages: django-environ
Successfully installed django-environ-0.8.1
2行目以降は実行結果です。
実際に対象となる値を確認しましょう。Djangoでプロジェクト作成時デフォルトでsettings.pyにSECRET_KEYがハードコーティングされています。この値は外部に非公開にすべき値です。(※settings.pyには他にもハードコーティングすべきでない値はあります。)
また、今回はDEBUGの設定値も取り扱います。
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'XXXXXX'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
Appフォルダ、manage.pyと同じ階層に.envファイルを作成する。.envファイルがJavaで言うSystem.propertiesのファイルに相当。
.envの中身は次のように設定する。
SECRET_KEY='XXXXXX'
DEBUG=True
.envには余分な空白は入力しないこと。
setting.pyを更新しましょう。
+import environ
+import os
# .envでDEBUGを指定しない場合デフォルトでFalseが設定される。
+env = environ.Env(
+ DEBUG=(bool, False)
+)
BASE_DIR = Path(__file__).resolve().parent.parent
+environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
-SECRET_KEY = 'XXXXXX'
+SECRET_KEY = env('SECRET_KEY')
-DEBUG = True
+DEBUG = env('DEBUG')
以上のように変更後manage.pyのrunserverコマンドで無事起動できれば完了となる。
push前に.gitignoreで.envファイルが追跡対象外となっていることを確認しましょう。
補足
BASE_DIR = Path(__file__).resolve().parent.parent
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
Path(__file__)は処理を実行しているファイルのパスを指す。.resolve()の処理でシンボリックリンク等が使用されていた場合解消後絶対パスに変換し返却される。.parent部分で一つ上の階層のディレクトリを参照する。
二行目でOS依存のパスの部分と.envの格納されたディレクトリのパスを連結し.envファイルを読み込んでいる。
参考
django-environ
BASE_DIRについて