본문 바로가기
장고 프레임워크

4) APIView를 활용한 뷰 만들기

by 문자메일 2020. 6. 7.

 

아래는 강의와 관련 없는 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/

 

DRF(Django Rest Framework) view vs generic view vs viewset 도대체 뭘 쓰면 좋을까요 · Tonic

사이트 운영에 도움을 주실 수 있습니다. 고맙습니다. --> DRF(Django Rest Framework) view vs generic view vs viewset 도대체 뭘 쓰면 좋을까요 2019년 11월 30일 목적 Django Rest Framework(이하 ‘DRF’)를 쓰다보면 데�

devlog.jwgo.kr

 

 

 

 

 

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이다.

다양한 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)

댓글