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 ?
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.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments