Rest Framework에서 View, APIView 및 GenericAPIView 비교 분석 정보

24959 단어
1)APIView(rest_framework.views.APIView) APIView는 REST 프레임워크가 제공하는 모든 보기의 기본 클래스로 Django의 View 부류를 계승한다.APIViewView의 차이점은 다음과 같다.
보기 방법에 전송된 것은 REST 프레임워크의 Request 대상이지 Django의 HttpRequeset 대상이 아니다.
보기 방법은 REST 프레임워크의 Response 대상을 되돌려주고 보기는 응답 데이터 설정(render)이 전방 요구에 부합되는 형식을 설정합니다. APIException 이상은 모두 포착되고 적합한 응답 정보로 처리됩니다.
  • dispatch()분배를 진행하기 전에 요청에 대해 신분인증, 권한검사, 데이터 제어를 실시한다.

  • 정의된 속성을 지원합니다.
  • authentication_classes 목록 또는 원조, 신분인증 클래스
  • permissoin_classes 목록 또는 원조, 권한 검사 클래스
  • throttle_classes 목록 또는 원조, 유량 제어 클래스
  • 2)GenericAPIView(rest_framework.generics.GenericAPIView) APIVIew에서 계승하여 목록 보기와 상세한 보기에 사용할 수 있는 일반적인 지원 방법을 추가했습니다.일반적으로 사용하는 경우 하나 이상의 Mixin 확장 클래스와 함께 사용할 수 있습니다.
    정의된 속성을 지원합니다.
  • 목록 뷰는 상세 정보 뷰와 동일합니다.
  • queryset 목록 보기의 조회 집합
  • serializer_class 보기에 사용되는 서열화기
  • 목록 보기 사용:
  • pagination_class 페이지 제어 클래스
  • filter_backends 필터 제어 백엔드
  • 세부 정보 페이지 보기:
  • lookup_field 단일 데이터베이스 대상을 조회할 때 사용하는 조건 필드입니다. 기본값은 'pk'
  • lookup_url_kwarg에서 단일 데이터를 조회할 때 URL의 매개 변수 키워드 이름, 기본값과lookfield 동일

  • 제공되는 방법:
  • 목록 뷰는 상세 정보 뷰와 동일합니다.
  • get_set(self) 보기를 되돌려주는 데 사용되는 조회 집합은 목록 보기와 상세한 보기에서 데이터를 얻는 기초입니다. 기본 되돌려주기 queryset 속성은 다시 쓸 수 있습니다. 예를 들어
    def get_queryset(self):
        user = self.request.user
        return user.accounts.all()
    
  • get_serializer_class(self)는 서열화기 클래스를 되돌려줍니다. 기본 되돌려주기 serializer_class 는 다시 쓸 수 있습니다. 예를 들어
    def get_serializer_class(self):
        if self.request.user.is_staff:
            return FullAccountSerializer
        return BasicAccountSerializer
    
  • get_serializer(self,args,*kwargs)는 서열화기 대상을 되돌려주고 다른 보기나 확장 클래스에 사용됩니다. 만약 우리가 보기에서 서열화기 대상을 얻으려면 이 방법을 직접 호출할 수 있습니다.서열화기 대상을 제공할 때 REST 프레임워크는 대상의 context 속성에 세 가지 데이터를 추가합니다: Request,format,view. 이 세 가지 데이터 대상은 서열화기를 정의할 때 사용할 수 있습니다.

  • 자세히 보기:
  • get_object(self)는 자세한 보기에 필요한 모델 클래스 데이터 대상을 되돌려줍니다. 기본값lookup_field 인자로queryset을 필터합니다.시도에서 이 방법으로 자세한 정보를 얻을 수 있는 모델 클래스의 대상을 호출할 수 있습니다.자세한 정보를 방문한 모델 클래스의 대상이 존재하지 않으면 404로 돌아갑니다.이 메서드는 기본적으로 APIView에서 제공하는 check 를 사용합니다.object_permissions 방법은 현재 대상이 접근할 수 있는 권한이 있는지 확인합니다.


  • 예:
    # url(r'^books/(?P\d+)/$', views.BookDetailView.as_view()),
    class BookDetailView(GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request, pk):
            book = self.get_object()
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    

    !!!!다섯 개의 확장 클래스!!!!
    1)ListModelMixin
    목록 보기 확장 클래스, 제공 list(request, *args, **kwargs) 방법으로 목록 보기를 신속하게 실현하고 200 상태 코드를 되돌려줍니다.
    Mixin의list 메서드는 데이터를 필터링하고 페이지를 나눕니다.
    소스 코드:
    class ListModelMixin(object):
        """
        List a queryset.
        """
        def list(self, request, *args, **kwargs):
            #   
            queryset = self.filter_queryset(self.get_queryset())
            #   
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
            #    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    

    예:
    from rest_framework.mixins import ListModelMixin
    
    class BookListView(ListModelMixin, GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request):
            return self.list(request)
    

    2)CreateModelMixin
    보기 확장 클래스를 만들고 create(request, *args, **kwargs) 방법을 제공하여 자원을 만드는 보기를 신속하게 실현하고 201 상태 코드를 성공적으로 되돌려줍니다.
    만약 서열화기가 전방에서 보낸 데이터 검증에 실패하면 400 오류를 되돌려줍니다.
    소스 코드:
    class CreateModelMixin(object):
        """
        Create a model instance.
        """
        def create(self, request, *args, **kwargs):
            #       
            serializer = self.get_serializer(data=request.data)
            #   
            serializer.is_valid(raise_exception=True)
            #   
            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
        def perform_create(self, serializer):
            serializer.save()
    
        def get_success_headers(self, data):
            try:
                return {'Location': str(data[api_settings.URL_FIELD_NAME])}
            except (TypeError, KeyError):
                return {}
    

    3) RetrieveModelMixin
    상세한 보기 확장 클래스는 retrieve(request, *args, **kwargs) 방법을 제공하여 존재하는 데이터 대상을 신속하게 되돌릴 수 있습니다.
    존재하면 200으로 돌아가고 그렇지 않으면 404로 돌아갑니다.
    소스 코드:
    class RetrieveModelMixin(object):
        """
        Retrieve a model instance.
        """
        def retrieve(self, request, *args, **kwargs):
            #     ,        
            instance = self.get_object()
            #    
            serializer = self.get_serializer(instance)
            return Response(serializer.data)
    

    예:
    class BookDetailView(RetrieveModelMixin, GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request, pk):
            return self.retrieve(request)
    

    4)UpdateModelMixin
    보기 확장 클래스를 업데이트하고 update(request, *args, **kwargs) 방법을 제공하여 존재하는 데이터 대상을 신속하게 업데이트할 수 있습니다.
    또한 partial_update(request, *args, **kwargs) 방법을 제공하여 국부 업데이트를 실현할 수 있다.
    200 을 성공적으로 되돌렸고, 서열화기 검사 데이터가 실패했을 때 400 오류를 되돌려줍니다.
    소스 코드:
    class UpdateModelMixin(object):
        """
        Update a model instance.
        """
        def update(self, request, *args, **kwargs):
            partial = kwargs.pop('partial', False)
            instance = self.get_object()
            serializer = self.get_serializer(instance, data=request.data, partial=partial)
            serializer.is_valid(raise_exception=True)
            self.perform_update(serializer)
    
            if getattr(instance, '_prefetched_objects_cache', None):
                # If 'prefetch_related' has been applied to a queryset, we need to
                # forcibly invalidate the prefetch cache on the instance.
                instance._prefetched_objects_cache = {}
    
            return Response(serializer.data)
    
        def perform_update(self, serializer):
            serializer.save()
    
        def partial_update(self, request, *args, **kwargs):
            kwargs['partial'] = True
            return self.update(request, *args, **kwargs)
    

    5)DestroyModelMixin
    보기 확장 클래스를 삭제하고 destroy(request, *args, **kwargs) 방법을 제공하면 존재하는 데이터 대상을 신속하게 삭제할 수 있습니다.
    204를 성공적으로 반환했습니다. 404를 반환한 것은 존재하지 않습니다.
    소스 코드:
    class DestroyModelMixin(object):
        """
        Destroy a model instance.
        """
        def destroy(self, request, *args, **kwargs):
            instance = self.get_object()
            self.perform_destroy(instance)
            return Response(status=status.HTTP_204_NO_CONTENT)
    
        def perform_destroy(self, instance):
            instance.delete()
    

    3. 사용 가능한 하위 클래스 보기
    1) CreateAPIView
    post 방법 제공
    GenericAPIView, CreateModelMixin에서 상속
    2)ListAPIView
    get 방법 제공
    상속: GenericAPIView, ListModelMixin
    3)RetireveAPIView
    get 방법 제공
    상속: GenericAPIView, RetrieveModelMixin
    4)DestoryAPIView
    삭제 방법 제공
    GenericAPIView, DestoryModelMixin에서 상속
    5)UpdateAPIView
    put 및 patch 방법 제공
    상속: GenericAPIView, UpdateModelMixin
    6)RetrieveUpdateAPIView
    get,put,patch 방법 제공
    GenericAPIView, RetrieveModelMixin, UpdateModelMixin
    7)RetrieveUpdateDestoryAPIView
    get,put,patch,delete 방법 제공
    GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestoryModelMixin
    뷰세트 ViewSet
    뷰세트 ViewSet을 사용하여 일련의 논리적 관련 작업을 하나의 클래스에 배치할 수 있습니다.
  • list() 데이터 세트 제공
  • retrieve() 단일 데이터 제공
  • create() 생성 데이터
  • 업데이트 () 데이터 저장
  • destory() 데이터 삭제
  • ViewSet 보기 집합 클래스는 get (),post () 등의 방법을 실현하지 않고 list (),create () 등 동작을 실행합니다.
    뷰 세트는 as 만 사용view () 방법이 있을 때 액션 동작을 구체적인 요청 방식과 대응합니다.예:
    class BookInfoViewSet(viewsets.ViewSet):
    
        def list(self, request):
            ...
    
        def retrieve(self, request, pk=None):
            ...
    

    경로를 설정할 때 우리는 다음과 같이 조작할 수 있다
    urlpatterns = [
        url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
        url(r'^books/(?P\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
    ]
    

    action 속성
    보기 집합에서 현재 보기 집합을 요청할 때의 액션 동작이 무엇인지 액션 대상 속성을 얻을 수 있습니다.
    예를 들면 다음과 같습니다.
    def get_serializer_class(self):
        if self.action == 'create':
            return OrderCommitSerializer
        else:
            return OrderDataSerializer
    

    공통 뷰 세트 상위 클래스
    1) ViewSet
    계승자APIView는 APIView와 기본적으로 유사한 역할을 하며 신분인증, 권한 검사, 데이터 관리 등을 제공했다.
    ViewSet에서 어떤 동작 액션 방법도 제공하지 않았습니다. 우리가 직접 액션 방법을 실현해야 합니다.
    2)GenericViewSet
    GenericAPIVIew와 유사하게 getobject、get_queryset 등 방법은 목록 보기와 상세한 정보 보기의 개발에 편리하다.
    3)ModelViewSet
    계승자GenericAPIView에는List Model Mixin,Retrieve Model Mixin,Create Model Mixin,Update Model Mixin,Destory Model Mixin이 포함되어 있다.
    4)ReadOnlyModelViewSet
    계승자GenericAPIVIew는ListModelMixin,RetrieveModelMixin을 포함한다.
    보기 집중 정의 추가 액션 동작
    뷰 세트에서 위의 기본 메소드 동작 외에도 사용자 정의 동작을 추가할 수 있습니다.
    사용자 정의 동작을 추가하려면 GenericAPIVIew 장식기를 사용해야 합니다.
    액션 장식기로 장식하는 방법명은 액션 동작명으로 리스트,retrieve와 동일합니다.
    action 장식기는 두 개의 매개 변수를 수신할 수 있습니다:
  • methods: 이 action이 지원하는 요청 방식, 목록 전달
  • detail: action에서 처리할 보기 자원의 대상인지 여부를 표시합니다. (즉 url 경로를 통해 메인 키를 가져오는지 여부입니다.)
  • True는 URL을 통해 얻은 주 키에 대응하는 데이터 대상을 표시한다
  • False는 URL을 사용하지 않고 키를 가져오는 것을 의미합니다

  • 예:
    from rest_framework import mixins
    from rest_framework.viewsets import GenericViewSet
    from rest_framework.decorators import action
    
    class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        # detail False           BookInfo  
        @action(methods=['get'], detail=False)
        def latest(self, request):
            """
                     
            """
            book = BookInfo.objects.latest('id')
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    
        # detail True,        pk     BookInfo  
        @action(methods=['put'], detail=True)
        def read(self, request, pk):
            """
                      
            """
            book = self.get_object()
            book.bread = request.data.get('read')
            book.save()
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    

    url의 정의
    urlpatterns = [
        url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
        url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
        url(r'^books/(?P\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
        url(r'^books/(?P\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
    ]

    좋은 웹페이지 즐겨찾기