DjangoのDEBUGを環境変数で切り替える方法【Python】
目次
DEBUGを環境変数で切り替える方法とは?
PythonのWebフレームワークであるDjango(ジャンゴ)には本番環境と開発環境を切り替えるDEBUG変数というのものがあります。
この変数はbool
で、True
にするとプロジェクトが開発モードになり、False
にすると本番モードになります。
便利なDEBUG
変数ですが、マジックナンバーでベタ書きしておくと何かと変更が必要になり不便です。
そこでこの記事では、このDEBUG
変数を環境変数で動的に切り替える方法を解説します。
環境変数を使うことでシェルからDEBUG
の値を切り替えることが可能になります。
具体的には↓を見ていきます。
DEBUGとは?
環境変数とは?
DEBUGを環境変数で切り替える
DEBUG
変数と環境変数の解説も合わせて行っています。
DEBUGとは?
DEBUG
変数とは、プロジェクトのsettings.py
内に書かれているbool
値の変数です。
DEBUG = True
このDEBUG
は何のために存在しているのでしょうか?
DEBUG
は、プロジェクトのデバッグモードを有効/無効にする場合に使われます。
デバッグモードを有効にする場合はDEBUG
をTrue
に、デバッグモードを無効にする場合はDEBUG
をFalse
にします。
プロジェクトはデバッグモードが有効にされている場合と無効にされている場合とでは、その振る舞いが変わります。
代表的なのがエラー時のスタックトレースです。
DEBUG
がTrue
の状態だと、Djangoはエラーが発生したときにデバッグレベルで内容を出力します。
これはスタックトレースを含み、変数などの詳細な状態を出力します。
開発時ではこのスタックトレースをたよりにデバッグを進めます。
このため、プロジェクトの本番稼働時にこのDEBUG
がTrue
になっていると、第3者にプロジェクトの内部状態をさらすことになります。
このため、本番環境ではこのDEBUG
はTrue
にしてはいけません。
DEBUG
がTrue
の状態では、Djangoは速度やリソースを犠牲にしてデバッグに最適化された状態で動作します。
SQLクエリをメモリに保存したり、キャッシュを無効にしたりなど、本番環境では適さない状態で動きます。
DEBUG
はこの他にも、ユーザー(開発者)側の設定で使われます。
デバッグ時とそうでない場合に設定を切り替えたい場合は、このDEBUG
を使いif
文で分岐します。
環境変数とは?
環境変数とは、OSが提供するデータ共有の仕組みです。
異なるプロセス間で共通のデータ内容を簡易的に共有したい時に、この環境変数が使われます。
このデータは文字列で表現されます。
Pythonではこの環境変数はos
モジュールのenviron
で参照することが出来ます。
environ
にはget()
メソッドがあり、このメソッドで指定した環境変数の値を取得することが可能です。
import os env_val = os.environ.get('MY_ENV_VAR', 'default value')
↑の場合、環境変数MY_ENV_VAR
が設定されている場合はその変数の値がenv_val
に保存されます。
設定されていない場合はdefault value
がデフォルト値としてenv_val
に保存されます。
Windowsのコマンドプロンプトでは環境変数は↓のようにコマンドラインから実行すれば一時的に設定できます。
> set MY_ENV_VAR=1
↑の場合、MY_ENV_VAR
環境変数に値1
が設定されます。
LinuxなどのBashの場合は↓のようにコマンドラインから実行すれば環境変数を一時的に設定できます。
$ export MY_ENV_VAR=1
DEBUGを環境変数で切り替える
DEBUG
を環境変数で設定する場合、考えなくてはいけない項目は↓の通りです。
環境変数の名前
環境変数の値
環境変数の値をboolに変換する
このうち、環境変数の名前ですが、これはDEBUG
とします。
そうすることでDEBUG
変数と関連性が出て認識しやすくなります。
また、環境変数の値は整数を文字列で表します。
この文字列の整数は最終的にbool
値に変換されるわけなので、値は文字列の0
か1
になります。
環境変数の文字列の整数の値をbool
に変換するには、まずint()
で値を整数にキャストします。
それからその整数をbool()
で真偽値にキャストすればOKです。
ということでsettings.py
でDEBUG
の値を環境変数で設定する方法は↓のようになります。
import os DEBUG = bool(int(os.environ.get('DEBUG', '0')))
↑のコードでDEBUG
を環境変数の値で初期化することが可能になります。
環境変数DEBUG
の値が0
であればDEBUG
変数はFalse
に、1
であればTrue
になります。
デフォルト値は0
なので、環境変数が設定されていない場合はDEBUG
はFalse
になります。
Windowsのコマンドプロンプトでは↓のようにすれば開発モードでサーバーが起動します。
> set DEBUG=1 > python manage.py runserver 0.0.0.0:4123
また、本番モードは↓のようにします。
> set DEBUG=0 > python manage.py runserver 0.0.0.0:4123
LinuxのBashなどでは↓のようにすればDEBUG
の値を切り替えられます。
$ DEBUG=1 python manage.py runserver 0.0.0.0:4123 $ DEBUG=0 python manage.py runserver 0.0.0.0:4123
おわりに
今回はsettings.py
のDEBUG
を環境変数で切り替える方法を解説しました。
環境変数でDEBUG
を切り替えられるようになるとデプロイの自動化が一歩進みます。
プロジェクトの設定は環境変数に設定するようにすると抽象度が上がって管理がしやすくなります。
(^ _ ^) | 環境変数は便利 |