본문 바로가기

Framework/Django

[Django] View - Base view

반응형

Django view 의 가장 기본이 되는 View 클래스에 대해서 알아보려 한다.

1. Base view

Django 에서 view class 를 구현하기 위해 기본적으로 제공해주는 Base view 들이 있다. View, TemplateView, RedirectView 이렇게 3가지 클래스를 Base view 라고 한다. 이들은 각각의 용도에 맞게 사용할 수도 있고 다른 View class 에서 상속받아 사용하기도 한다.

 

View: 모든 class-based view 가 상속하는 클래스
TemplateView: request 로 입력된 parameter 들을 가지고 지정되어 있는 템플릿을 렌더링 해주는 view
RedirectView: 지정된 URL 로 redirect 하는 view

 

이 중에서 가장 기본이 되는 클래스인 View 에 대해서 아래에서 정리해본다.

2. View 클래스

View 클래스는 django.views.generic.base.View 에 정의되어 있다.

View 클래스는 이전 게시물의 class-based views 의 예시와 같이 커스텀 View 클래스 구현 시 상속받아 사용할 수 있다. url 매핑시에는 as_view() 메서드를 통해 Callable view 객체를 반환하는데, 이 객체를 통해 request 를 처리한다.

view 객체를 뜯어보면 request 를 입력받아 setup -> dispatch 순서로 로직을 수행한다. dispatch 내부에서는 우선 reuqest http method 를 확인하여 허용하지 않는 method 인 경우 http_method_not_allowed 로직으로 예외를 처리한다. 허용된 method 인 경우 해당 handler 객체에 request 를 넘겨서 처리한다.

- setup()

setup 은 입력된 요청을 기반으로 객체를 초기화 한다. 아래 코드에서 알 수 있듯이 매개변수로 받은 request, args, kwargs 등을 객체에 저장한다.

 

def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    if hasattr(self, "get") and not hasattr(self, "head"):
        self.head = self.get
    self.request = request
    self.args = args
    self.kwargs = kwargs

- dispatch()

view 로직을 처리하는 함수로 request 를 입력받아 HTTP response 를 반환한다.

 

def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(
            self, request.method.lower(), self.http_method_not_allowed
        )
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)


입력된 request 의 HTTP method 를 확인하여 이에 매칭되는 method 에 request 를 할당하여 처리한다. GET 은 get() 에게 POST 는 post() 에게 매칭되는 식으로 HTTP method 의 소문자 이름을 가진 method 에 작업을 할당한다.

HTTP method 가 유요한지 확인할 때 http_method_names 를 확인하는데, 이는 아래와 같이 각 HTTP method 를 소문자로 바꿔서 미리 정의해놓은 리스트이다.

 

http_method_names = [
    "get",
    "post",
    "put",
    "patch",
    "delete",
    "head",
    "options",
    "trace",
]

- http_method_not_allowed

만약 dispatch 에서 잘못된 HTTP method 가 입력되거나 알맞은 handler method 가 구현되어 있지 않는 경우에는 http_method_not_allowed 를 호출한다.

 

def http_method_not_allowed(self, request, *args, **kwargs):
    response = HttpResponseNotAllowed(self._allowed_methods())
    log_response(
        "Method Not Allowed (%s): %s",
        request.method,
        request.path,
        response=response,
        request=request,
    )

    if self.view_is_async:

        async def func():
            return response

        return func()
    else:
        return response

 

http_method_not_allowed() 메서드는 405 Method Not Allowed 코드를 반환하는 HttpResponseNotAllowed 객체를 생성하여 이를 반환한다.

반응형

'Framework > Django' 카테고리의 다른 글

[Django] View - function-based view, class-based view  (0) 2026.01.03
[Django] Logging  (0) 2025.12.29
[Django] Caching  (1) 2025.12.27
[Django] Settings  (0) 2025.12.26
[Django] Model Query  (0) 2025.12.13