Django Web Framework/Django 일반

CSRF 에 대한 custom error view 만들기

bluebamus 2024. 3. 26.

 - 현재 400, 403, 404, 500에 대한 에러를 custom view를 만들어 자체 템플릿을 이용해 서비스 하고 있다.

# urls.py

if not settings.DEBUG:
    handler400 = "common.error.error_views.bad_request_page"
    handler403 = "common.error.error_views.permission_denied_page"
    handler404 = "common.error.error_views.page_not_found_page"
    handler500 = "common.error.error_views.server_error_page"
import logging
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render, redirect

logger = logging.getLogger(getattr(settings, "BLOG_LOGGER", "django"))


# 400(Error)
def bad_request_page(request, exception=None):
    logger.debug("http 400 error")
    response = HttpResponse()
    response.status_code = 400  # Or any other HTTP status code
    context = {"status_code": response.status_code}
    return render(request, "errors/error.html", context=context)


# 403(Error)
def permission_denied_page(request, exception=None):
    logger.debug("http 403 error")
    response = HttpResponse()
    response.status_code = 403  # Or any other HTTP status code
    context = {"status_code": response.status_code}
    return render(request, "errors/error.html", context=context)


# 404(Error)
def page_not_found_page(request, exception=None):
    logger.debug("http 404 error")
    response = HttpResponse()
    response.status_code = 404  # Or any other HTTP status code
    context = {"status_code": response.status_code}
    return render(request, "errors/error.html", context=context)


# 500(Error)
def server_error_page(request, exception=None):
    logger.debug("http 500 error")
    response = HttpResponse()
    response.status_code = 500  # Or any other HTTP status code
    context = {"status_code": response.status_code}
    return render(request, "errors/error.html", context=context)

 

 - 테스트 중 CSRF에 대한 에러는 만들어 놓은 에러의 조건에 걸러지지 않는다는 것을 확인할 수 있었다.

 - 검색과 문서를 통해 확인할 결과, CSRF는 별도의 처리 과정을 가지고 있으며, csrf_failure(request, reason="")를 오버라이딩 하여 수정할 수 있다는 것을 확인하였다.

 

 - settings.py에 다음과 같이 추가를 한다.

CSRF_FAILURE_VIEW = "common.error.error_views.csrf_failure"

 

 - views.py에 에러를 추가한다. 본인은 common/error/error_views.py에 뷰를 만든다.

   - 주의할 점은 다른 에러 뷰 처럼 exception 파라미터를 넣으면 에러가 발생한다. input 파라미터를 꼭 지켜줘야 한다. 

...
# CSRF(Error)
def csrf_failure(request, reason=""):
    logger.debug("CSRF error")
    return redirect("home:index")

 

 - reference : 

https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-CSRF_FAILURE_VIEW

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

https://docs.djangoproject.com/en/5.0/topics/http/views/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

https://github.com/nmtitov/django-http-api/tree/master

 

GitHub - nmtitov/django-http-api: Elegant HTTP API library for Django

Elegant HTTP API library for Django. Contribute to nmtitov/django-http-api development by creating an account on GitHub.

github.com

 

댓글