I’d like to do the following:
raise HttpResponseForbidden()
But I get the error:
exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden
How should I do this?
4 Answers
if you want to raise an exception you can use:
from django.core.exceptions import PermissionDenied
def your_view(...):
raise PermissionDenied()
It is documented here :
https://docs.djangoproject.com/en/stable/ref/views/#the-403-http-forbidden-view
As opposed to returing HttpResponseForbidden
, raising PermissionDenied
causes the error to be rendered using the 403.html
template, or you can use middleware to show a custom “Forbidden” view.
8
Can we add a custom message in PermissionDenied?
– A.J.Jack, yes you can — do something like: raise PermissionDenied(“No logged in user”)
Not sure if it matters, but the docs say
throw PermissionDenied
not as a function call, without the()
at the end.– FydoWhat’s the advantage of using this over HttpResponseForbidden?
– Flimm@Flimm: This automatically triggers 403 at middleware level, allowing you to show your custom “Forbidden” view.
Return it from the view as you would any other response.
from django.http import HttpResponseForbidden
return HttpResponseForbidden()
3
Why does there exists an exception class
Http404
but notHttp403
? Why the inconsistency?– Flimm@Flimm stackoverflow.com/questions/3297048/… I’m not sure about Django, but Django REST Framework has: from rest_framework import status status.HTTP_403_FORBIDDEN 403
Actually using
raise PermissionDenied
has the advantage of letting you show your custom 403 view
You can optionally supply a custom template named “403.html” to control the rendering of 403 HTTP errors.
As correctly pointed out by @dave-halter, The 403 template can only be used if you raise PermissionDenied
Below is a sample view used to test custom templates “403.html”, “404.html” and “500.html”; please make sure to set DEBUG=False in project’s settings or the framework will show a traceback instead for 404 and 500.
from django.http import HttpResponse
from django.http import Http404
from django.core.exceptions import PermissionDenied
def index(request):
html = """
<!DOCTYPE html>
<html lang="en">
<body>
<ul>
<li><a href="https://stackoverflow.com/">home</a></li>
<li><a href="?action=raise403">Raise Error 403</a></li>
<li><a href="?action=raise404">Raise Error 404</a></li>
<li><a href="?action=raise500">Raise Error 500</a></li>
</ul>
</body>
</html>
"""
action = request.GET.get('action', '')
if action == 'raise403':
raise PermissionDenied
elif action == 'raise404':
raise Http404
elif action == 'raise500':
raise Exception('Server error')
return HttpResponse(html)
2
This does not work. The 403 template can only be used if you raise PermissionDenied.
Try this Way , sending message with Error
from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")