Performance: Permission required decorator
This affects server response time and user interaction speed by controlling access before view logic runs.
Jump into concepts and practice - no test required
from django.contrib.auth.decorators import permission_required @permission_required('app.view_model') def my_view(request): # heavy processing here return render(request, 'template.html')
from django.http import HttpResponseForbidden def my_view(request): if not request.user.has_perm('app.view_model'): return HttpResponseForbidden() # heavy processing here return render(request, 'template.html')
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Permission check inside view | N/A (server-side) | N/A | N/A | [X] Bad |
| Permission check with decorator | N/A (server-side) | N/A | N/A | [OK] Good |
@permission_required decorator in Django?@permission_required decorator checks if a user has a specific permission before allowing access to a view.@permission_required to require the permission app.view_item on a Django view function?app.change_item permission accesses /edit-item/?
@permission_required('app.change_item', login_url='/login/')
def edit_item(request):
return HttpResponse('Item edited')login_url='/login/' for unauthorized users.raise_exception is not set, the user is redirected to the login URL specified.@permission_required:
@permission_required('app.delete_item', raise_exception=True)
def delete_item():
return HttpResponse('Deleted')request. Here, it is missing.raise_exception=True is valid. The decorator can be used on functions.app.add_item permission can access it. If they lack permission, you want to show a 403 error instead of redirecting. Which is the correct way to do this?raise_exception=True causes Django to return a 403 Forbidden error if the user lacks permission.