APIView lets you create your own special web addresses that do exactly what you want. It helps you control how your app talks to others.
APIView for custom endpoints in Django
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
Django
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class MyCustomView(APIView): def get(self, request): # code to handle GET request return Response({'message': 'Hello, GET!'}, status=status.HTTP_200_OK) def post(self, request): # code to handle POST request data = request.data return Response({'received': data}, status=status.HTTP_201_CREATED)
Each method (get, post, put, delete) matches an HTTP action.
Use Response to send data back to the user.
Examples
Django
class HelloView(APIView): def get(self, request): return Response({'greeting': 'Hi there!'})
Django
class EchoView(APIView): def post(self, request): return Response({'you_sent': request.data})
Django
class MultiMethodView(APIView): def get(self, request): return Response({'method': 'GET'}) def delete(self, request): return Response({'method': 'DELETE'}, status=204)
Sample Program
This view keeps a simple count. GET shows the current count. POST increases the count by one and returns it.
Django
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class SimpleCounterView(APIView): count = 0 def get(self, request): return Response({'count': self.count}) def post(self, request): SimpleCounterView.count += 1 return Response({'count': SimpleCounterView.count}, status=status.HTTP_201_CREATED)
Important Notes
APIView does not connect to URLs automatically; you must add it to your URL patterns.
State like count in the example is shared across requests and users, so use with care.
Use serializers to validate and clean data before processing.
Summary
APIView lets you write your own rules for web requests.
You define methods like get() and post() to handle different actions.
Use Response to send back data and status codes.
Practice
1. What is the main purpose of using
APIView in Django REST Framework?easy
Solution
Step 1: Understand the role of APIView
APIView allows you to write custom logic for handling HTTP requests by defining methods like get() and post().Step 2: Compare other options
Options A, C, and D describe unrelated tasks like database management, styling, or authentication without coding, which APIView does not do automatically.Final Answer:
To create custom endpoints by defining methods like get() and post(). -> Option DQuick Check:
APIView = custom HTTP methods [OK]
Hint: APIView is for custom HTTP methods like get/post [OK]
Common Mistakes:
- Thinking APIView auto-generates database tables
- Confusing APIView with template rendering
- Assuming APIView manages authentication alone
2. Which of the following is the correct way to import
APIView and Response in a Django REST Framework view?easy
Solution
Step 1: Recall correct import paths
APIView is imported from rest_framework.views and Response from rest_framework.response.Step 2: Check other options for errors
from django.views import APIView from django.http import Response uses django.views and django.http which do not provide APIView or DRF Response. import APIView from rest_framework import Response from rest_framework uses invalid import syntax. from rest_framework.api import APIView from rest_framework.api import Response uses wrong module paths.Final Answer:
from rest_framework.views import APIView from rest_framework.response import Response -> Option BQuick Check:
Correct import paths = from rest_framework.views import APIView from rest_framework.response import Response [OK]
Hint: APIView from views, Response from response module [OK]
Common Mistakes:
- Importing APIView from django.views
- Using incorrect import syntax
- Importing Response from wrong module
3. Given this APIView code, what will be the HTTP status code in the response?
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloView(APIView):
def get(self, request):
return Response({"message": "Hello!"}, status=201)medium
Solution
Step 1: Identify the status code in Response
The Response is returned with status=201, which means Created.Step 2: Match status code to HTTP meaning
201 means resource created successfully, so the response status will be 201 Created.Final Answer:
201 Created -> Option AQuick Check:
Status=201 means Created [OK]
Hint: Check status argument in Response call [OK]
Common Mistakes:
- Assuming default 200 OK without checking status
- Confusing 201 with 404 or 500
- Ignoring the status parameter in Response
4. Identify the error in this APIView code snippet:
from rest_framework.views import APIView
from rest_framework.response import Response
class MyView(APIView):
def post(self, request):
data = request.data
return Response(data, status=200)
def get(self):
return Response({"msg": "Hello"})medium
Solution
Step 1: Check method signatures
In APIView, all HTTP methods must accept self and request parameters. The get method lacks the request parameter.Step 2: Validate other statements
Returning Response in post is correct. Status 200 is valid. request.data is accessible in APIView.Final Answer:
The get method is missing the request parameter. -> Option AQuick Check:
All HTTP methods need request parameter [OK]
Hint: Check method parameters: self and request required [OK]
Common Mistakes:
- Omitting request parameter in methods
- Thinking status=200 is invalid
- Believing request.data is unavailable
5. You want to create a custom APIView that accepts a POST request with JSON data containing a number, doubles it, and returns the result with status 200. Which code snippet correctly implements this?
hard
Solution
Step 1: Check method and parameters
POST method must be defined with self and request parameters. class DoubleView(APIView): def post(self, request): num = request.data.get('number') result = num * 2 return Response({'result': result}, status=200) correctly defines post(self, request).Step 2: Validate data access and response
class DoubleView(APIView): def post(self, request): num = request.data.get('number') result = num * 2 return Response({'result': result}, status=200) safely uses request.data.get('number') and multiplies by 2. It returns Response with status=200 as required.Step 3: Review other options
class DoubleView(APIView): def post(self, request): num = request.data['number'] result = num + num return Response({'result': result}, status=201) uses status=201 (wrong status). class DoubleView(APIView): def get(self, request): num = request.data.get('number') result = num * 2 return Response({'result': result}, status=200) uses get method instead of post. class DoubleView(APIView): def post(self): num = request.data.get('number') result = num * 2 return Response({'result': result}, status=200) misses request parameter in post method.Final Answer:
class DoubleView(APIView): def post(self, request): num = request.data.get('number') result = num * 2 return Response({'result': result}, status=200) -> Option CQuick Check:
POST with request param, multiply, status=200 [OK]
Hint: POST method with request param, multiply, return status 200 [OK]
Common Mistakes:
- Using get method instead of post
- Missing request parameter in method
- Returning wrong status code
- Accessing request.data incorrectly
