아래는 강의와 관련 없는 views와 generic view와 viewset 차이 잘 설명되어있는 블로그
DRF(Django Rest Framework) view vs generic view vs viewset 도대체 뭘 쓰면 좋을까요
https://devlog.jwgo.kr/2019/11/30/4-way-to-build-api-using-drf/
APIView는 위에 적힌 것처럼 get,post,put,delete에 맞게 멤버함수를 구현하면, 해당 method 요청이 들어올 때 호출하는것이 기본이다.
그런데 API View를 상속받아 사용하면 멤버함수 호출하기 전에 APIView 내 dispatch에.initial() 단계에서 위에 1~5 순서대로 먼저 처리를 하게 된다.
(위 5가지 기능이 편하게 구현되어 있는 것이 DRF를 쓰는 이유인듯 하다.)
initial( ):
안에서 self.perform_content_negotiation()에서 client에 어떤 응답을 줄 것인지 content를 탐지한다. (Content-Type 헤더 탐지하는 것인가?)
self.determine_version() 에서 version 탐지한다.
self.perform_authentication(request) 에서 인증 체크
self.check_permissions(request) 에서 퍼미션 체크
self.check_throttles(request)에서 요청수 제한 체크
# 아래 부분은 API View 마다 지원하는 http method를 명시해 두는대, 요청으로 들어온 method가 API View에서 지원하는 method list 목록에 있다면, self에서 해당 method의 멤버함수를 찾아서, 실제 멤버함수를 호출한다. 아래는 이 내용 코드
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), ... )
response = handler(request, *args, **kwargs)
View 마다 get, put, delete 처리 멤버함수를 하나하나 따로 만들 수 있겠지만, 몇번 구현하다보면 각 method별 사용하는 패턴이 보이게 된다.
보이는 반복되는 APIView의 사용 패턴들을 모아서 패턴화 시켜 만들어놓은 것이 django rest framework의 generics API이다.
API View ---합쳐서 구조화---> generics ---합쳐서 구조화---> viewSet
아래는 작성 예시
1.generics API 상속받아서 구현
# class PublicPostListAPIView(generics.ListAPIView):
# queryset = Post.objects.filter(is_public=True)
# serializer_class = PostSerializer
2. APIView 상속받아서 구현
# class PublicPostListAPIView(APIView):
# def get(self, request):
# qs = Post.objects.filter(is_public=True)
# serializer = PostSerializer(qs, many=True)
# return Response(serializer.data)
# public_post_list = PublicPostListAPIView.as_view()
3. @api_view 장식자로 함수형으로 구현
@api_view(['GET'])
def public_post_list(request):
qs = Post.objects.filter(is_public=True)
serializer = PostSerializer(qs, many=True)
return Response(serializer.data)
'장고 프레임워크' 카테고리의 다른 글
forms.py (0) | 2020.06.13 |
---|---|
HINT: Add or change a related_name argument to the definition for 'Post.like_user_set' or 'Post.author'. (0) | 2020.06.11 |
views.py에 관하여 (0) | 2020.06.04 |
Django Template 문법에 관하여 (0) | 2020.06.03 |
Django Model 관계에 관하여. (0) | 2020.06.03 |
댓글