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

빅재미코딩님의 프로필 이미지
빅재미코딩

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

장고 기본 CBV API (Generic display views) (2)

BaseListView 클래스의 get 메서드는 언제/누가 호출하나요?

해결된 질문

작성

·

345

0

BaseListView 클래스 get 메서드 로직은 대체로 이해가 가는데 ListView클래스 기반 뷰 내부로직에서 어디에서 이 get메서드를 호출하는지 궁금합니다.

답변 2

1

이진석님의 프로필 이미지
이진석
지식공유자

.as_view 를 통해 생성된 view 함수가 있을 테구요.

관련 http 요청을 받아서 view 함수가 호출이 되면, 마지막에 dispatch 메서드를 호출하고 있습니다.

image관련 코드 : https://github.com/django/django/blob/879e5d587b84e6fc961829611999431778eb9f6a/django/views/generic/base.py#L96

dispatch 메서드에서는 현 요청의 request.method 값을 소문자로 변환하여 (GET 요청일 경우 "get", POST 요청일 경우 "post"), 그 이름의 메서드를 찾아서 호출하여 요청을 처리합니다.

image관련 코드 : https://github.com/django/django/blob/879e5d587b84e6fc961829611999431778eb9f6a/django/views/generic/base.py#L138

화이팅입니다. ;-)

0

아..그렇군요! 감사합니다!

그런데 추가 질문 2개가 있습니다

추가질문1.

그런데 handler에 함수가 담겨있으니 일급함수 문법으로 되어있는게 맞는거죠? getattr 은 bulitin 으로 동적으로 객체에서 어떤문자열이름으로 객체(여기서는 get 이름)를 만들어내는거구요.


추가질문2.

근데 가장하위의 ListView클래스 인스턴스에서 get 메서드는

BaseListView에서 상속 받은 get 뿐이라 이게 호출되는건 알겠는데

GET요청이 오면 get메서드가 호출되고 POST요청이오면 post 메서드가 호출될텐데 ... 즉, get 말고도 다른놈들이 호출될수있는건데 아래처럼 다른 HTTP method 놈들은 어디있나요?

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

ListView 모든 부모(상속관계)들 쭉 따라가서 봤는데 아무리봐도 잘 안보이네요 ㅜㅜ

이진석님의 프로필 이미지
이진석
지식공유자

파이썬 getattr은 다음의 함수 signature를 가집니다.

getattr(object, name)
getattr(object, name, default)

공식문서 : https://docs.python.org/3/library/functions.html#getattr

getattr을 통해 object로부터 name 이름의 attribute를 조회합니다.

지정 name의 attribute가 없을 경우
- default 인자를 지정하지 않으면 AttributeError 예외가 발생하고
- default 인자를 지정하면 그 default 인자를 반환합니다.

해당 CBV에서 특정 http method를 지원할 때, 해당 메서드를 구현하는 것입니다.

만약 post 메서드가 없다면 그 CBV에서는 http method "POST"를 지원하지 않는 다는 의미가 됩니다.

POST 요청을 받았을 경우, 아래와 같이 코드 수행이 될 것이고

handler = getattr(self, "post", self.http_method_not_allowed)

CBV에는 post 메서드가 없으니, handler는 self.http_method_not_allowed 를 할당받게 됩니다.

http_method_not_allowed 메서드는 상태코드 405로서 Method Not Allowed (POST) 응답을 합니다.

관련 코드 : https://github.com/django/django/blob/4.2/django/views/generic/base.py#L145

화이팅입니다. :-)

아 그렇군요 ListView 클래스 기반 뷰는 조회 다보니 GET 만 지원하도록 설계/구현 해놨나보네요

 

감사합니다.

빅재미코딩님의 프로필 이미지
빅재미코딩

작성한 질문수

질문하기