본문 바로가기

Python/Django

[Django] APIView, api_view가 뭐야?

728x90

django rest framework를 사용하다 보면 접할 수 있는 APIView 클래스와 api_view 장식자에 대해 알아보겠습니다.

 

우선 api_view부터 알아보겠습니다. api_view는 아래의 코드에서 확인할 수 있듯이 decorator입니다. api_view decorator는 첫 번째 인자는 해당 함수에서 사용할 수 있는 request method를 지정하는 것으로 형식은 리스트입니다.

 

@api_view(['GET', 'POST'])
def article_list_create_api_view(request):
    if request.method == 'GET':
        articles = Article.objects.filter(active=True)
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

위의 코드는 GET, POST 함수를 request로 요청할 수 있고, 각각의 요청은 조건문에 의해 구분되어 그에 맞는 결과를 반환하게 됩니다.

 

다음은 APIView 입니다. APIView는 api_view와는 다르게 클래스로 정의됩니다. APIView를 상속받은 클래스 안에 request method에 맞는 함수들을 정의해주면 각각의 요청은 request method 이름에 맞게 구분되어 그에 맞는 결과를 반환하게 됩니다.

 

class ArticleListCreateAPIView(APIView):

    def get(self, request):
        articles = Article.objects.filter(active=True)
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

article_list_create_api_view, ArticleListCreateAPIView는 함수와 클래스로 구현한다는 점에서는 차이가 존재하고, 코드 또한 다르지만 같은 기능을 합니다. 다음은 api 요청 결과 확인입니다.

 

api 요청 결과 확인

728x90