提高Django REST中的异常

时间:2015-08-01 20:39:22

标签: 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

详情如下,

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")

有什么想法吗?

3 个答案:

答案 0 :(得分:14)

from rest_framework.exceptions import NotFound

课程NotFoundAPIException延伸。 APIException的默认状态代码为500 Internal Server Error,而NotFound的默认状态代码为404

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

所以当你这样做时:

from rest_framework.decorators import api_view

@api_view()
def example1(request):
    raise NotFound('not found')

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

docstring说:

  

返回应该用于任何给定异常的响应。通过   我们默认处理REST框架APIException,以及Django   内置ValidationErrorHttp404PermissionDenied   例外。任何未处理的异常都可能会返回None   引起500错误。

答案 1 :(得分:2)

我不确定你为什么要这样做。这是DRF在无法找到资源时使用的内部例外。但是你在任何DRF机器之外的标准Django视图中使用它。如果你想这样做,你应该使用标准的Django异常:

from django.core.exceptions import Http404

def example1(request):
    raise Http404('not found')

答案 2 :(得分:0)

尝试使用与所有可能网址匹配的reqular表达式更改您的网址,并将其放在主urls.py的末尾

代表:

urlpatterns = [
url(r'^(?P<slug>[\w-]+)/', views.example1),
]