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