2011년 2월 17일 목요일

[Django] 500 Error Page

Django 의 500 에러(디버그)페이지를 입 맛에 맞게 수정하기

Django는 기본적으로 에러템플릿(500.html)이 있다. exception이 발생하면 500.html이 표시되면서 상세한 exception log를 볼 수 있다. 매우 고마운 기능이다.

하지만 이게 불편하고 오히려 방해되는 케이스도 있다. Django로 Web용이 아닌, 특수한 서버를 구축했을 경우다. 특정 디바이스나 프로그램 같은 클라이언트와 HTTP를 이용해 통신하기 위한 서버라면, exception이 발생했을 때 클라이언트로 500.html의 방대하고 부끄러운(?) 내용이 전송되어 버리는 거다.

그래서 Django는 500 Server Error 시 특정 템플릿을 이용하거나 커스터마이징 할 수 있도록 배려하고 있다 .

http://docs.djangoproject.com/en/dev/topics/http/views/

하지만 이거 잘 안되더라. (이유는 끝에...) 일단 메모겸 해서 정리 좀 해보자.

일단 handler500을 정의해야 된다. 내 경우 App의 urls.py에 handler500을 명시했다.
handler500 = 'appname.views.server_error'
그러면 500 에러 발생 시 views모듈의 server_error라는 놈을 실행시킬거다. 물론 이 녀석도 view 중에 하나이니 view의 모양을 따라야겠지.
def server_error(request, template_name='500.html'):
  pass
기본적으로 요렇게 빚어줘야 할 거다.

그럼 입맛에 맞게 템플릿을 구축하거나 로그를 찍으면 될 거다. 내 경우는 클라이언트에 에러(500)를 알려주고 내부적으로 로그를 남기는 기능이 절실했다.

http://seorenn.blogspot.com/2011/02/python-log-detailed-exception.html

이 내용을 참고해서 exception의 자세한 모양을 남겨보자.
def server_error(request, template_name='500.html'):
  mylog('500 error')
  type, value, tb = sys.exc_info()
  mylog(type.__name__ + ': ')
  mylog(value)
  mylog('\n'.join(traceback.format_tb(tb)))

  return HttpResponse(status=500)
단 settings에서 Debug=True 로 되어있으면 동작 안하더라! 이유는 모르겠다. (문서를 대충 봤더니 -_-). Debug를 False로 만들기 전 까지 왜 동작하는지 모르고 고생만 했었다는 고통의 추억이 아직도 날 괴롭힌다.

댓글 1개 :

allieus :

custom middleware 를 정의해서 쓰는 방법도 있는 듯 함. 이건 DEBUG=True 에서도 동작하는 거 같던데 -_-a

http://www.turnkeylinux.org/blog/django-exceptions