인프런 커뮤니티 질문&답변

seonjoo님의 프로필 이미지
seonjoo

작성한 질문수

작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지

Authentication 인증시스템 구축

django 함수 호출에 관하여

작성

·

705

0

안녕하세요~ 

최근에 장고 학습하면서 함수 호출에 관하여 궁금해서 살펴보고 있는데요, 

as_view() 함수 호출이 궁금해서 확인을 해봤습니다.

def as_view(cls, **initkwargs):
        """Main entry point for a request-response process."""
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError(
                    'The method name %s is not accepted as a keyword argument '
                    'to %s().' % (keycls.__name__)
                )
            if not hasattr(clskey):
                raise TypeError("%s() received an invalid keyword %r. as_view "
                                "only accepts arguments that are already "
                                "attributes of the class." % (cls.__name__, key))

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            if not hasattr(self'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)
        view.view_class = cls
        view.view_initkwargs = initkwargs

        # take name and docstring from class
        update_wrapper(viewclsupdated=())

        # and possible attributes set by decorators
        # like csrf_exempt from dispatch
        update_wrapper(viewcls.dispatchassigned=())
        return view

이렇게 코드가 선언되어 있었는데요, 

관련해서 찾아보니까 as_view() 함수는 클래스의 인스턴스를 생성하고, 인스턴스의 dispatch() 메소드를 호출한다. 라고 하더라구요

그런데 제가 python 코드를 잘 모르는 건지, 어떤건지 모르겠지만, 

update_wrapper

이 함수에서 as_view 내부의 view 함수를 호출하는 게 맞는 건가요???

답변 2

0

seonjoo님의 프로필 이미지
seonjoo
질문자

감사합니다 ㅎㅎ 많은 도움 되었습니다!

0

Hyong Sok Park님의 프로필 이미지
Hyong Sok Park
지식공유자

안녕하세요!
질문 확인했습니다.

일단 질문에 먼저 답변을 드리자면,
update_wrapper 함수에서 view를 호출하는게 아닙니다.

정확하게는 마지막 부분,


return
view

부분에서 view를 호출합니다.

그리고 이 view 를 살펴보면,


def
view(request, *args, **kwargs):
self = cls(**initkwargs)
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls.__name__
)
return self.dispatch(request, *args, **kwargs)

다시 self.dispatch 를 되돌려주는 것을 볼 수 있죠.

dispatch 의 경우에는, 요청받은 get, post 등과 같은 HTTP 메서드를
Class based view 내부에 선언된 get,post 와 같은 클래스 메서드와
매칭시켜 보내주는 작업이라 보시면 됩니다.

원래 저희가 앞서 만든 Function based view 에서는
굳이 이런 과정이 필요 없었던 것이,
request, 혹은 kwargs 같은 데이터들이 바로 function 에 공급되기 때문입니다.

하지만 class based view 같은 경우,
class 내부에 get, post 등과 같은 여러가지 메서드들이 있잖아요?
HTTP 요청을 보내는 메서드에 따라 분기를 시켜주어야 하기 때문에 있는거라고 생각하시는게 좋습니다.

실제로 View 의 윗 부분 코드를 보게 되면,


class View:
"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
"""

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

def __init__(self, **kwargs):
"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
....

꽤나 많은 HTTP 메서드 종류가 있는걸 볼 수 있죠.


django 내부에서 어떻게 request 처리가 이루어지는지 더 정확하게 알고 싶으시다면,
해당 부분에 중단점을 잡아두시고 코드를 하나하나 찍어나가면서
흐름을 파악해보시는 것도 좋은 방법일 것 같습니다.

아무튼 답변 도움이 되셨으면 좋겠네요.
좋은하루 보내시구요!
감사합니다-

seonjoo님의 프로필 이미지
seonjoo

작성한 질문수

질문하기