🎁 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는 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
REST 프레임워크는 Django View
클래스의 하위 클래스로 APIView
클래스를 제공한다. APIView
클래스는 일반 View
클래스와 아래와 같은 점에서 다른 부분이 있다.
이 외에는 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)