DRF를 활용한 API 만들기 - APIView

💜poiuyy0420·2021년 2월 4일
4

Django

목록 보기
2/2
post-thumbnail
post-custom-banner

django-rest-framework 공식문서

🎁 DRF(Django REST Framework)를 활용해서 API 만들면서 Views, Generic views, Viewsets 개념을 정리해 보려고 한다.

공식문서에 보면 카테고리가 나누어져 있다.

Views : Class-based Views(CBV) / Function Based Views(FBV)
Generic views : Mixins / generics APIView
Viewsets

이렇게 보면 APIView(CBV), @apiView(FBV), mixins, generics, ViewSet 5가지가 있다. @api_view, APIView -> Generic views -> viewsets 으로 갈수록 코드를 간략하게 API로 만들 수 있다.

APIView

APIView는 Class-based Views(CBV) 중 하나이기 때문에 하나의 URL 에 대해서만 처리를 할 수 있다.
CVB로 작성시 http 메소드에 해당하는 함수를 만들어줘야 한다.
해당 함수 명은 지정되어 있으며, http의 메소드 명과 동일하다.

📢 참고로 ViewSet은 2개의 url도 하나의 클래스에서 처리가 가능하다고 한다.

# get_object 메소드로 우선 존재하는 인스턴스인지 판단해준다.
# 인스턴스가 존재한다면 그것을 리턴한다.
# 여기서 리턴한 인스턴스(article)는 아래 메소드에서 공통으로 사용한다.
def get_object(self, pk):
    article = get_object_or_404(Article, pk = pk)
    return article

# pk에 해당하는 객체를 get_object()를 통해 반환 받는다.
def get(self, request):
    pass 
def post(self, request):
    pass 
def put(self, request):
    pass
def delete(self, request):
    pass
    

APIView Class

REST 프레임워크는 Django View 클래스의 하위 클래스로 APIView 클래스를 제공한다. APIView 클래스는 일반 View 클래스와 아래와 같은 점에서 다른 부분이 있다.

  • Request는 Django의 HttpRequest 인스턴스가 아닌 REST 프레임워크의 request인스턴스이다.
  • Django의 HttpResponse가 아닌 REST 프레임워크의 Response를 반환한다.
  • APIException 예외케이스가 발견되면 적절한 response으로 조정됨
  • Incoming request를 authenticate하고, 적절한 권한 혹은 throttle(제한사항) 체크한 실행함

이 외에는 APIView 클래스는 View클래스를 사용하는 것과 동일하다. 들어오는 request는 .get()이나 .post()와 같은 적절한 핸들러 method로 전달된다.

# views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User

class ListUsers(APIView):

    authentication_classes = [authentication.TokenAuthentication]
    permission_classes = [permissions.IsAdminUser]

    def get(self, request, format=None):
        # 모든 사용자 리스트 반환
        usernames = [user.username for user in User.objects.all()]
        return Response(usernames)    
profile
안녕하세요 :)
post-custom-banner

0개의 댓글