はじめに
Djangoのエラーハンドリングについて調べている際に、組み込みモジュールとして提供しているdefaults(django.views.defaults)の中身を見る機会がありましたので確認した内容を整理してみました。
defaultsのエラーハンドリング
defaults の中でエラーハンドリングを実装しているステータスコードとデフォルトで使っているテンプレートは以下となります。
ステータスコード | テンプレート |
---|---|
400(bad request) | 400.html |
403(HTTP Forbidden) | 403.html |
404(page not found) | 404.html |
500(server error) | 500.html |
defaults のソースコードを確認すると、ステータスコードに対応するテンプレートに必要な情報を渡すというシンプルな作りになっているようです。
また、公式ドキュメントを確認するとステータスコード400/404/500は DEBUG
がFalse
の場合のみ defaults で定義しているテンプレート(400.htmlなど)を使用するとの記載があります。
ステータスコード | 仕様 |
---|---|
400(bad request) |
|
403(HTTP Forbidden) |
|
404(page not found) |
|
500(server error) |
|
そのため、defaults で実装しているエラーハンドリングを使用したい場合は DEBUGモードを無効にする 必要がありそうです。
DEBUGモードのエラーハンドリングについて
DEBUGフラグによって使用するエラーハンドリングの割り振りをしているのはexception(django.core.handlers.exception) で、DEBUG
がTrue
の場合は defaults ではなくdebug(django.views.debug)にあるエラーハンドリングが呼び出されるようです。
今回わかったこと
- エラーによってはDEBUGフラグによって使用するテンプレートが変わる
-
defaults で実装しているエラーハンドリングを使用したい場合は
DEBUG
をFalse
にする - DEBUGフラグによって使用するエラーハンドリングの割り振りをしているのは exception
-
DEBUG
がTrue
の場合は defaults ではなく debug にあるエラーハンドリングが呼び出される
おわりに
defaults を読み解くことでエラーによってはDEBUGフラグによって使用するテンプレートが変わることがわかりました。
今後は exception も確認し、DEBUGがTrueの場合にどのような動作をするかも確認してみたいと思います。
また、エラー時にslackに通知するなどの拡張も簡単にできるようなので試してみたいです。