4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エーピーコミュニケーションズAdvent Calendar 2022

Day 20

【Django】defaultsから読み解くエラーハンドリング

Last updated at Posted at 2022-12-20

はじめに

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は DEBUGFalseの場合のみ defaults で定義しているテンプレート(400.htmlなど)を使用するとの記載があります。

ステータスコード 仕様
400(bad request)
  • とくになにもテンプレートに渡さない
  • DEBUGFalseの場合のみ400.htmlを使用する
403(HTTP Forbidden)
  • exceptionの内容をテンプレートに渡す
404(page not found)
  • エラーになったRequestのpathとexceptionの内容をテンプレートに渡す
  • DEBUGFalseの場合のみ404.htmlを使用する
500(server error)
  • とくになにもテンプレートに渡さない
  • DEBUGFalseの場合のみ500.htmlを使用する

そのため、defaults で実装しているエラーハンドリングを使用したい場合は DEBUGモードを無効にする 必要がありそうです。

DEBUGモードのエラーハンドリングについて

DEBUGフラグによって使用するエラーハンドリングの割り振りをしているのはexception(django.core.handlers.exception) で、DEBUGTrueの場合は defaults ではなくdebug(django.views.debug)にあるエラーハンドリングが呼び出されるようです。

今回わかったこと

  • エラーによってはDEBUGフラグによって使用するテンプレートが変わる
  • defaults で実装しているエラーハンドリングを使用したい場合はDEBUGFalseにする
  • DEBUGフラグによって使用するエラーハンドリングの割り振りをしているのは exception
  • DEBUGTrueの場合は defaults ではなく debug にあるエラーハンドリングが呼び出される

おわりに

defaults を読み解くことでエラーによってはDEBUGフラグによって使用するテンプレートが変わることがわかりました。
今後は exception も確認し、DEBUGがTrueの場合にどのような動作をするかも確認してみたいと思います。
また、エラー時にslackに通知するなどの拡張も簡単にできるようなので試してみたいです。

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?