Skip to content

API Views

DRF provides an @api_view decorator for function-based views and an APIView class for class-based views.

Function-Based Views (@api_view)

The @api_view decorator ensures your view receives instances of DRF's Request (instead of Django's HttpRequest) and allows returning a DRF Response.

python
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method == 'POST':
        return Response({"message": "Got some data!", "data": request.data}, status=status.HTTP_201_CREATED)
    return Response({"message": "Hello, world!"})

Class-Based Views (APIView)

Class-based views provide a cleaner way to structure your code for complex logic.

python
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetList(APIView):
    """
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(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)

Generic Views

For common CRUD operations, DRF provides generic views like ListCreateAPIView, RetrieveUpdateDestroyAPIView, etc., saving you from writing boilerplate code.

python
from rest_framework import generics
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer