Django Web Framework/Django 일반
CSRF 에 대한 custom error view 만들기
- 현재 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
https://docs.djangoproject.com/en/5.0/topics/http/views/
https://github.com/nmtitov/django-http-api/tree/master
'Django Web Framework > Django 일반' 카테고리의 다른 글
django admin에서 list의 항목, 상세 페이지의 항목 커스터마이징 하는 방법 (1) | 2024.09.06 |
---|---|
Django의 트랜잭션 Lock - SW의 Lock과 DB의 Lock 정리 (0) | 2024.05.14 |
웹 애플리케이션의 성능 지표 및 측정 (측정 도구) (0) | 2024.02.01 |
django에서 db row lock을 실행할 수 있는 방법 (0) | 2023.12.18 |
Django migrate 잘 쓰기 위한 정리 노트 (0) | 2023.12.15 |
댓글