DjangoのDEBUGを環境変数で切り替える方法【Python】

157, 2021-01-13

目次

DEBUGを環境変数で切り替える方法とは?

PythonのWebフレームワークであるDjango(ジャンゴ)には本番環境と開発環境を切り替えるDEBUG変数というのものがあります。
この変数はboolで、Trueにするとプロジェクトが開発モードになり、Falseにすると本番モードになります。

便利なDEBUG変数ですが、マジックナンバーでベタ書きしておくと何かと変更が必要になり不便です。

そこでこの記事では、このDEBUG変数を環境変数で動的に切り替える方法を解説します。
環境変数を使うことでシェルからDEBUGの値を切り替えることが可能になります。
具体的には↓を見ていきます。

  • DEBUGとは?

  • 環境変数とは?

  • DEBUGを環境変数で切り替える

DEBUG変数と環境変数の解説も合わせて行っています。

DEBUGとは?

DEBUG変数とは、プロジェクトのsettings.py内に書かれているbool値の変数です。

DEBUG = True

このDEBUGは何のために存在しているのでしょうか?
DEBUGは、プロジェクトのデバッグモードを有効/無効にする場合に使われます。
デバッグモードを有効にする場合はDEBUGTrueに、デバッグモードを無効にする場合はDEBUGFalseにします。

プロジェクトはデバッグモードが有効にされている場合と無効にされている場合とでは、その振る舞いが変わります。
代表的なのがエラー時のスタックトレースです。
DEBUGTrueの状態だと、Djangoはエラーが発生したときにデバッグレベルで内容を出力します。
これはスタックトレースを含み、変数などの詳細な状態を出力します。
開発時ではこのスタックトレースをたよりにデバッグを進めます。

このため、プロジェクトの本番稼働時にこのDEBUGTrueになっていると、第3者にプロジェクトの内部状態をさらすことになります。
このため、本番環境ではこのDEBUGTrueにしてはいけません。

DEBUGTrueの状態では、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値に変換されるわけなので、値は文字列の01になります。

環境変数の文字列の整数の値をboolに変換するには、まずint()で値を整数にキャストします。
それからその整数をbool()で真偽値にキャストすればOKです。

ということでsettings.pyDEBUGの値を環境変数で設定する方法は↓のようになります。

import os

DEBUG = bool(int(os.environ.get('DEBUG', '0')))

↑のコードでDEBUGを環境変数の値で初期化することが可能になります。
環境変数DEBUGの値が0であればDEBUG変数はFalseに、1であればTrueになります。
デフォルト値は0なので、環境変数が設定されていない場合はDEBUGFalseになります。

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.pyDEBUGを環境変数で切り替える方法を解説しました。
環境変数でDEBUGを切り替えられるようになるとデプロイの自動化が一歩進みます。
プロジェクトの設定は環境変数に設定するようにすると抽象度が上がって管理がしやすくなります。

環境変数は便利

参考