Performance: Custom permissions
Custom permissions affect server response time and API interaction speed, impacting how quickly permission checks complete before rendering content.
Jump into concepts and practice - no test required
class EfficientPermission(BasePermission): def has_permission(self, request, view): # Use cached user roles or prefetch related data user_roles = getattr(request.user, '_cached_roles', None) if user_roles is None: user_roles = list(UserRole.objects.filter(user=request.user)) request.user._cached_roles = user_roles return any(role.name == 'admin' for role in user_roles)
class SlowPermission(BasePermission): def has_permission(self, request, view): # Query database multiple times for each check roles_to_check = ['admin', 'moderator'] for role_name in roles_to_check: if UserRole.objects.filter(user=request.user, name=role_name).exists(): return True return False
| Pattern | DB Queries | Server Delay | Impact on INP | Verdict |
|---|---|---|---|---|
| Multiple DB queries per check | Many per request | High (50-100ms) | Increases input delay | [X] Bad |
| Cached roles with single DB query | One per session/request | Low (10-20ms) | Improves input responsiveness | [OK] Good |
has_permission.has_permission returns True or False to allow or deny access.from rest_framework.permissions import BasePermission
class IsAuthenticatedCustom(BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_authenticated
from rest_framework.permissions import BasePermission
class IsOwnerPermission(BasePermission):
def has_permission(self, request, view):
return request.user == view.get_object().owner
has_permission checks general access; has_object_permission checks per object.has_object_permission, not has_permission.