Django

[Django] 500 Internal server error handler

torimuk 2022. 2. 14. 13:35

Problem


http 500 서버 에러 발생 시의 처리 로직을 구현.

Solution


이미 구현되어 있는 django.conf.urls.handler500 을 이용한다.

django.conf.urls.handler500 에 view의 함수를 지정해주고, view에서 에러 관련 처리를 해준다.

*urls.py*

import django.conf.urls

django.conf.urls.handler500 = "apps.views.error500"

필자는 에러 정보를 slack bot을 통해 송신한 다음 에러 페이지를 출력하는 로직을 구현하였다.

발생한 에러는 traceback.format_exc()를 사용해 저장하면 된다.

err_str = traceback.format_exc()
*views.py*

def error500(request):
    username = request.session.get("username", "unknown")
    cur_time = timezone.now()
    cur_time = cur_time + timezone.timedelta(hours=9)
    cur_time = cur_time.strftime(CONST.CURTIME_FORM)

    setting_value = str(settings).split('"')[-2]  # settings 값을 문자열로 읽어옴
    target = setting_value.split(".")[-1]  # settings 파일

    err_str = traceback.format_exc()
    msg = "===========================================================================\n"
    msg += f"*[{target} server 에러 발생]*\n>*유저*: {username}\n>*발생 일시*: {cur_time}\n\n*에러 코드*```{err_str}```\n"

    data = {
        'token': slack_token,
        'channel': CONST.SLACK_CHANNEL,
        'as_user': True,
        'text': msg,
    }
    requests.post(url='https://slack.com/api/chat.postMessage', data=data)

    return render(request, '500.html', status=500)