해결된 질문
작성
·
345
0
BaseListView 클래스 get 메서드 로직은 대체로 이해가 가는데 ListView클래스 기반 뷰 내부로직에서 어디에서 이 get메서드를 호출
하는지 궁금합니다.
답변 2
1
.as_view 를 통해 생성된 view 함수가 있을 테구요.
관련 http 요청을 받아서 view 함수가 호출이 되면, 마지막에 dispatch 메서드를 호출하고 있습니다.
dispatch 메서드에서는 현 요청의 request.method 값을 소문자로 변환하여 (GET 요청일 경우 "get", POST 요청일 경우 "post"), 그 이름의 메서드를 찾아서 호출하여 요청을 처리합니다.
화이팅입니다. ;-)
0
아..그렇군요! 감사합니다!
그런데 추가 질문 2개가 있습니다
그런데 handler에 함수가 담겨있으니 일급함수 문법으로 되어있는게 맞는거죠? getattr 은 bulitin 으로 동적으로 객체에서 어떤문자열이름으로 객체(여기서는 get 이름)를 만들어내는거구요.
근데 가장하위의 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
화이팅입니다. :-)