[DRF #3] Django REST framework

LILO Ghim·2021년 12월 31일
0

DRF3


Django REST framework 튜토리얼 #3


FBV와 CBV


API view를 작성하는데 두 가지 방식이 있다


  • FBV : Function Based View
  • CBV : Class Based View


있는데! 이번엔 CBV


Function-based View와 동일한 역할을 하는 코드를 Class로 구현


class SnippetDetail(APIView):
    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404
    
    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)
    
    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

여기서 , check 해야 할 부분은

  • get_object() 메소드
  • self / self.get_object
    - get_object method로 pk값에 해당하는 인스턴스를 변수로 선언한다!
    - self는 SnippetDetail object

class SnippetList(APIView):
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        print(serializer.data)
        return Response(serializer.data)
    
    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        
        if serializer.is_valid():
            serializer.save()
            print(type(serializer.data))
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

function based view와 다른 점은,
함수형의 경우, 하나의 view에서 분기를 사용해서 각 method를 분리하였다면,
class based view에서는 각 함수별로 구분하였다.


DRF의 이해에 필요한 아래의 각 View 중에

APIView

mixins & genericAPIView

ViewSet


이 중 첫번째, APIView

APIView 클래스는 View 클래스를 사용하는 것과 거의 같다. 들어오는 request는 get() 또는 post()와 같은 handler method로 전달되고 API policy의 다양한 측면을 제어하는 여러 속성을 클래스에 설정할 수 있다.

Django View 클래스의 하위 클래스로 제공하는 APIView 클래스이다.

  • Request : Handler methods(get(), post())에 전달된 request는 Django HttpRequest인스턴스가 아닌 DRF의 request instance가 된다

  • Response : Hndler methods는 Django의 HttpResponse가 아닌 DRF reponse 를 반환

  • 들어오는 request는 handler method에 보내지기 전에 authenticationpermission, throttle check과정이 진행됨


API policy attributes

APIView 는 여러가지 기본 설정을 부여하게 된다.

  • . renderer_classes (serialization)
    • JSON 직렬화 : rest_framework.renderers.JSONRenderer
    • HTML 페이지 직렬화 : rest_framework.renderers.TemplateHTMLRenderer
  • .parser_classes (deserialization)
    • JSON 포맷 처리 : rest_framework.parsers.JSONParser
    • FormParser : rest_framework.parsers.FormParser
    • MultiPartParser : rest_framework.parsers.MultiPartParser
  • .authentication_classes(인증)
    • 세션기반인증 : rest_framework.authentication.SessionAuthentication
    • HTTP basic 인증 : rest_framework.authentication.BasicAuthentication
  • .throttle_classes
  • .permission_classes
    • 누구라도 접근 허용 : rest_framework.permissions.AllowAny
  • .content_negotiation_class
    • 같은 URL 요청에 대해서 JSON 응답을 할 지, HTML 응답을 할 지 판단
    • rest_framework.negotiation.DefaultContentNegotiation
profile
킴릴로

0개의 댓글