概要
前回のつづき。 DEBUG = False
のときでもエラーの内容がわかるようにする。
現在の状態
あっれれ〜? なぜか 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)
これ分かりやすいよね。
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)
現在の状態
以上で当初のノルマは完了した。個人的には、これで最大の山は超えたと思う。
ローカルのぱそこに仮想マシンの CentOS7 を用意して、つねに本番環境の設定(
DEBUG = False
)で開発する。
以下の怨嗟の声にも対応できる環境が完成だ。
- 自分のぱそこでは動くのに本番環境に移したら動かねえ!
- 本番環境で画像が表示されねえ!
- そのくせ、エラーはどこにも表示されねえ!
- 本番環境でエラーを表示させる方法ないんですか?(憤怒)
次回予告
山は越えたけれど、本当のゴールは本番環境で公開することだ。ネットで調べていてわかったんだが、専門用語ではデプロイっていうらしいぜ。次回はデプロイをしよう。そうそう、環境作りがタイヘンだったから忘れてたけど、サーバとかドメインとかそーいうのも初めてで、当時は五里霧中だったんだよ。
# おつかれやんした git commit.
$ git add --all
$ git commit -m "DEBUG=False 環境でのエラーハンドリングを追加"