概要

前回のつづき。 DEBUG = False のときでもエラーの内容がわかるようにする。

 

現在の状態

あっれれ〜? なぜか 500 エラーが表示されているけど、エラーメッセージがどこにも出なくて原因がわかんないぞ〜?

Error 500

def top(request):

    aaaa  # 突然の aaaa

    return render(request, 'app/top.html')

 

エラーハンドリングの追加

urls.py

from django.conf.urls import handler500

# 自作の 500 エラーハンドラー。
handler500 = views.my_error_handler

Django の中でエラーが発生したとき、 django.conf.urls.handler500 が自動で呼び出される。 handler500 はエラーを握りつぶしやがるのだ。これが原因でエラーが表示されていない。

その内容を自作メソッドにすげ替えちまおうってのが今回の作戦だ。以下に、目的別に自作メソッドの例を並べる。

 

views.py Apache のエラーログに出したいなら

こうじゃ。

def my_error_handler(request, *args, **kw):
    import traceback
    from django.http import HttpResponse
    print(traceback.format_exc())
    return HttpResponse('<h1>Server Error (500)</h1>')

見方はこう。

# 仮想マシンの中に入る。
$ vagrant ssh

# エラーログ表示。
$ sudo tail -f /var/log/httpd/error_log
略 [wsgi:error] 略   File "/vagrant/app/views.py", line 7, in top
略 [wsgi:error] 略     aaaa
略 [wsgi:error] 略 NameError: name 'aaaa' is not defined

 

views.py DEBUG=True のときみたいに画面に出したいなら

こうじゃ。

def my_error_handler(request, *args, **kw):
    import sys
    from django.views import debug
    from django.http import HttpResponse
    error_html = debug.technical_500_response(request, *sys.exc_info()).content
    return HttpResponse(error_html)

これ分かりやすいよね。

Display 500 error

 

views.py デフォルトの 500 表示にするなら

def my_error_handler(request, *args, **kw):
    from django.views.defaults import server_error as default_server_error
    return default_server_error(request, *args, **kw)

Error 500

 

現在の状態

開発環境完成

以上で当初のノルマは完了した。個人的には、これで最大の山は超えたと思う。

ローカルのぱそこに仮想マシンの CentOS7 を用意して、つねに本番環境の設定(DEBUG = False)で開発する。

以下の怨嗟の声にも対応できる環境が完成だ。

  • 自分のぱそこでは動くのに本番環境に移したら動かねえ!
  • 本番環境で画像が表示されねえ!
  • そのくせ、エラーはどこにも表示されねえ!
  • 本番環境でエラーを表示させる方法ないんですか?(憤怒)

 

次回予告

山は越えたけれど、本当のゴールは本番環境で公開することだ。ネットで調べていてわかったんだが、専門用語ではデプロイっていうらしいぜ。次回はデプロイをしよう。そうそう、環境作りがタイヘンだったから忘れてたけど、サーバとかドメインとかそーいうのも初めてで、当時は五里霧中だったんだよ。

# おつかれやんした git commit.

$ git add --all
$ git commit -m "DEBUG=False 環境でのエラーハンドリングを追加"