提高Django REST中的异常

Ric*_*ckD 6 django

我正在尝试测试django rest框架中的异常.基于http://www.django-rest-framework.org/api-guide/exceptions/引发NotFound,

默认情况下,此异常会导致HTTP状态代码"404 Not Found"的响应.

但是当我发出GET(到/ example1)时,我得到500,

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
Run Code Online (Sandbox Code Playgroud)

详情如下,

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',
)
Run Code Online (Sandbox Code Playgroud)

urls.py

from django.conf.urls import include, url
from api import views

urlpatterns = [
    url(r'example1', views.example1),
]
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

Arp*_*yal 15

from rest_framework.exceptions import NotFound
Run Code Online (Sandbox Code Playgroud)

课程NotFound从以下扩展而来APIException.APIExceptionis 的默认状态代码500 Internal Server Error,而NotFoundis 的默认状态代码404.

所以根据我在这里你试图rest framework在纯粹的django视图中抛出一个异常.我在这里写了一个测试用例来检查获得错误的几率.猜猜尝试引发rest framework异常的简单django视图不会被视为视图的错误.但是在提供装饰器并将其声明为API视图时,它会进入exception_handler

所以当你这样做时:

from rest_framework.decorators import api_view

@api_view()
def example1(request):
    raise NotFound('not found')
Run Code Online (Sandbox Code Playgroud)

现在,这被认为是由API引发的异常,它输入rest_framework EXCEPTION_HANDLER您提供的默认值,返回任何给定异常的响应.

docstring说:

返回应该用于任何给定异常的响应.默认情况下,我们处理REST框架APIException,也Django的内置ValidationError,Http404以及PermissionDenied 例外.任何未处理的异常都可能返回None,这将导致引发500错误.