I'm trying to test the exceptions within the django rest framework. Based on http://www.django-rest-framework.org/api-guide/exceptions/ raising NotFound,
By default this exception results in a response with the HTTP status code "404 Not Found".
However when I issue a GET (to /example1) I get a 500 with ,
Request Method: GET
Request URL: http://192.168.59.103:8002/example1
Django Version: 1.8.3
Exception Type: NotFound
Exception Value:
not found
Exception Location: /home/djangoapp/testtools/api/views.py in example1, line 7
Python Executable: /usr/bin/python
details below,
settings.py
REST_FRAMEWORK = {'EXCEPTION_HANDLER':'rest_framework.views.exception_handler'}
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
)
urls.py
from django.conf.urls import include, url
from api import views
urlpatterns = [
url(r'example1', views.example1),
]
views.py
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.exceptions import APIException,ParseError,NotFound
def example1(request):
raise NotFound("not found")
Any ideas ?
Custom exception handlingThe exception handler function should either return a Response object, or return None if the exception cannot be handled. If the handler returns None then the exception will be re-raised and Django will return a standard HTTP 500 'server error' response.
Django REST framework (DRF) is a powerful and flexible toolkit for building Web APIs. Its main benefit is that it makes serialization much easier. Django REST framework is based on Django's class-based views, so it's an excellent option if you're familiar with Django.
from rest_framework.exceptions import NotFound
The class NotFound
is extended from APIException
. The default status code for APIException
is 500 Internal Server Error
, whereas for NotFound
is 404
.
So according to me here you are trying to throw a rest framework
exception in a pure django view. I wrote a test case here to check what are the odds of getting the error raised. Guess what a simple django view trying to raise a rest framework
exception is not recognized as an error to the view. But on providing the decorator and declaring it an API View it enters the exception_handler
So when you do:
from rest_framework.decorators import api_view
@api_view()
def example1(request):
raise NotFound('not found')
This is now recognized as an exception thrown by the API which enters the default rest_framework
EXCEPTION_HANDLER
provided by you, where it returns the response for any given exception.
Its docstring
says:
Returns the response that should be used for any given exception. By default we handle the REST framework
APIException
, and also Django's built-inValidationError
,Http404
andPermissionDenied
exceptions. Any unhandled exceptions may returnNone
, which will cause a 500 error to be raised.
I'm not sure why you are doing this. That's an internal exception used by DRF when it can't find a resource. But you're using it in a standard Django view, outside any of the DRF machinery. If you want to do that, you should use the standard Django exception:
from django.core.exceptions import Http404
def example1(request):
raise Http404('not found')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With