Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is the purpose of permissions in Django REST Framework (DRF)?
Permissions control who can access or modify API endpoints. They help protect data by allowing only authorized users to perform certain actions.
Click to reveal answer
beginner
Name the default permission class in DRF and its behavior.
The default permission class is <code>AllowAny</code>. It lets anyone access the API without restrictions.
Click to reveal answer
intermediate
How do you apply permissions globally in a DRF project?
Set the DEFAULT_PERMISSION_CLASSES in the REST_FRAMEWORK settings in settings.py. This applies the permission to all views unless overridden.
Click to reveal answer
intermediate
What is the difference between IsAuthenticated and IsAdminUser permission classes?
IsAuthenticated allows access only to logged-in users. IsAdminUser allows access only to users with admin status (staff users).
Click to reveal answer
advanced
How can you create a custom permission in DRF?
Create a class inheriting from <code>BasePermission</code> and override the <code>has_permission</code> or <code>has_object_permission</code> methods to define your rules.
Click to reveal answer
Which DRF permission class allows unrestricted access to all users?
AIsAuthenticated
BIsAdminUser
CAllowAny
DIsAuthenticatedOrReadOnly
✗ Incorrect
AllowAny lets anyone access the API without restrictions.
Where do you set global permissions for all DRF views?
AIn each view's <code>permission_classes</code> attribute
BIn <code>REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES']</code> in <code>settings.py</code>
CIn <code>urls.py</code>
DIn the database
✗ Incorrect
Global permissions are set in settings.py under REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'].
Which permission class restricts access to only logged-in users?
AIsAuthenticated
BAllowAny
CIsAdminUser
DDjangoModelPermissions
✗ Incorrect
IsAuthenticated allows access only to users who are logged in.
What method do you override to check object-level permissions in a custom DRF permission?
Avalidate_permission
Bhas_permission
Ccheck_permission
Dhas_object_permission
✗ Incorrect
Override has_object_permission to check permissions for specific objects.
Which permission class allows read-only access to unauthenticated users but requires login for write actions?
AIsAuthenticatedOrReadOnly
BIsAdminUser
CAllowAny
DIsAuthenticated
✗ Incorrect
IsAuthenticatedOrReadOnly lets anyone read but only logged-in users write.
Explain how DRF permissions help secure an API and give examples of built-in permission classes.
Think about who can see or change data in your API.
You got /3 concepts.
Describe the steps to create and use a custom permission class in Django REST Framework.
Custom permissions let you write your own rules.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of permissions in Django REST Framework (DRF)?
easy
A. To control who can access or modify API endpoints
B. To style the API responses
C. To speed up database queries
D. To manage user sessions
Solution
Step 1: Understand the role of permissions in DRF
Permissions define rules about who can use or change API data.
Step 2: Compare options with permissions purpose
Only controlling access matches the purpose of permissions.
Final Answer:
To control who can access or modify API endpoints -> Option A
Quick Check:
Permissions = Access control [OK]
Hint: Permissions control access, not styling or speed [OK]
Common Mistakes:
Confusing permissions with styling or performance
Thinking permissions manage sessions
2. Which of the following is the correct way to apply the built-in permission IsAuthenticated to a DRF view?
easy
A. permissions = IsAuthenticated()
B. permission_classes = [IsAuthenticated]
C. permission_classes = IsAuthenticated
D. permission_classes = (IsAuthenticated)
Solution
Step 1: Recall DRF permission syntax
Permissions are set as a list or tuple in permission_classes.
Step 2: Check each option's syntax
permission_classes = [IsAuthenticated] uses a list with the class name, which is correct. permissions = IsAuthenticated() uses wrong attribute name and instance. permission_classes = IsAuthenticated misses list brackets. permission_classes = (IsAuthenticated) uses parentheses but without a comma, so it's not a tuple.
Final Answer:
permission_classes = [IsAuthenticated] -> Option B
Quick Check:
Use list for permission_classes [OK]
Hint: Use a list of permission classes for permission_classes [OK]
Common Mistakes:
Using instance instead of class in permission_classes
Forgetting to wrap in list or tuple
Using wrong attribute name
3. Given this DRF view snippet, what will happen if an anonymous user tries to access it?
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class MyView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({'message': 'Hello'})
medium
A. The user will receive a 401 Unauthorized response
This permission denies access to anonymous users and returns 401 Unauthorized.
Step 2: Analyze the code behavior for anonymous user
Since the user is not logged in, DRF returns 401, not 403 or success.
Final Answer:
The user will receive a 401 Unauthorized response -> Option A
Quick Check:
IsAuthenticated denies anonymous with 401 [OK]
Hint: IsAuthenticated returns 401 for anonymous users [OK]
Common Mistakes:
Confusing 401 Unauthorized with 403 Forbidden
Expecting anonymous users to see data
Thinking code has syntax errors
4. Identify the error in this custom permission class:
from rest_framework.permissions import BasePermission
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
# Usage in view
class MyView(APIView):
permission_classes = [IsOwner()]
def get(self, request, pk):
obj = get_object(pk)
self.check_object_permissions(request, obj)
return Response({'id': obj.id})
medium
A. get_object method is undefined
B. has_object_permission method is missing a return statement
C. check_object_permissions is called incorrectly
D. Permission class should be passed as class, not instance
Solution
Step 1: Check how permission_classes should be set
DRF expects permission classes, not instances, so use IsOwner without parentheses.
Step 2: Review other parts for errors
has_object_permission returns correctly, check_object_permissions usage is correct, get_object assumed defined elsewhere.
Final Answer:
Permission class should be passed as class, not instance -> Option D
Quick Check:
Use class names, not instances in permission_classes [OK]
Hint: Use class names, not instances, in permission_classes [OK]
Common Mistakes:
Passing permission instances instead of classes
Assuming missing return in has_object_permission
Confusing method calls with errors
5. You want to create a custom permission that allows access only if the user is authenticated and is the owner of the object. Which is the correct way to combine built-in and custom permissions in DRF?
hard
A. Set permission_classes = [IsAuthenticatedOrReadOnly, IsOwner] and override has_permission in IsOwner
B. Set permission_classes = [IsOwner] only and check authentication inside IsOwner
C. Set permission_classes = [IsAuthenticated, IsOwner] and implement has_object_permission in IsOwner
D. Set permission_classes = [IsAuthenticated()] and call IsOwner manually in the view
Solution
Step 1: Understand combining permissions in DRF
DRF checks all permissions in the list; all must allow access.
Step 2: Check how to combine authentication and ownership
Use IsAuthenticated to check login, and IsOwner to check object ownership via has_object_permission.
Step 3: Evaluate options
Set permission_classes = [IsAuthenticated, IsOwner] and implement has_object_permission in IsOwner correctly combines both permissions. Set permission_classes = [IsOwner] only and check authentication inside IsOwner misses separate authentication check. Set permission_classes = [IsAuthenticatedOrReadOnly, IsOwner] and override has_permission in IsOwner mixes permission types incorrectly. Set permission_classes = [IsAuthenticated()] and call IsOwner manually in the view uses instance and manual calls, which is not standard.
Final Answer:
Set permission_classes = [IsAuthenticated, IsOwner] and implement has_object_permission in IsOwner -> Option C
Quick Check:
Combine permissions in list for layered checks [OK]
Hint: List all needed permissions in permission_classes [OK]