我正在尝试测试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")
有什么想法吗?
答案 0 :(得分:14)
from rest_framework.exceptions import NotFound
课程NotFound
从APIException
延伸。 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 内置ValidationError
,Http404
和PermissionDenied
例外。任何未处理的异常都可能会返回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),
]