在Django REST中引发异常
我试图在django rest框架内测试异常。 根据未发现的数据 默认情况下,此异常会导致HTTP状态的响应 代码“404未找到” 但是,当我发出一个GET(to/example1)时,我得到了一个500在Django REST中引发异常,django,Django,我试图在django rest框架内测试异常。 根据未发现的数据 默认情况下,此异常会导致HTTP状态的响应 代码“404未找到” 但是,当我发出一个GET(to/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 fou
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
详情如下:
设置.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',
)
from django.conf.urls import include, url
from api import views
urlpatterns = [
url(r'example1', views.example1),
]
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")
url.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',
)
from django.conf.urls import include, url
from api import views
urlpatterns = [
url(r'example1', views.example1),
]
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")
视图.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',
)
from django.conf.urls import include, url
from api import views
urlpatterns = [
url(r'example1', views.example1),
]
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")
有什么想法吗?我不知道你为什么要这么做。这是DRF在找不到资源时使用的内部异常。但是您在标准Django视图中使用它,在任何DRF机器之外。如果要执行此操作,应使用标准Django异常:
from django.core.exceptions import Http404
def example1(request):
raise Http404('not found')
类NotFound
是从APIException
扩展而来的。APIException
的默认状态代码是500内部服务器错误
,而NotFound
的默认状态代码是404
因此,据我所知,您试图在纯django视图中抛出一个rest框架
异常。我在这里写了一个测试用例来检查出错的几率。猜猜一个简单的django视图试图引发rest框架
异常,但没有被认为是视图的错误。但是在提供decorator并将其声明为API视图时,它会进入异常处理程序
所以当你这样做的时候:
from rest_framework.decorators import api_view
@api_view()
def example1(request):
raise NotFound('not found')
这现在被识别为API引发的异常,该API进入由您提供的默认rest\u框架
exception\u处理程序
,在该处理程序中返回对任何给定异常的响应
它的docstring
上写着:
返回应用于任何给定异常的响应。通过
默认情况下,我们处理REST框架APIException,以及Django的
内置的ValidationError
,Http404
和PermissionDenied
例外情况。任何未处理的异常都可能返回None
,这将
导致引发500错误
尝试使用匹配所有可能url的reqular表达式更改url,并将其放在main url.py的末尾 例如:
urlpatterns = [
url(r'^(?P<slug>[\w-]+)/', views.example1),
]
urlpatterns=[
url(r'^(?P[\w-]+)/',视图。示例1),
]
Ok很酷。有道理。此外,如果我随后抛出/example2请求,这不应该在不需要我配置任何其他内容的情况下引发DRF的NotFound。如果代码保持不变,每个url的行为都应该是相同的。好的,我必须缺少一些内容,因为无法让它自动生成404 JSON响应。你的答案回答了90%的问题这只是最后一点,我没听懂。我唯一能想到的就是这一点。NotFound是一个api异常,您只能在APIView中将其作为错误引发。在纯django视图中,它被识别为内部服务器错误。你对最后一部分的意思是什么?在你对@ArpitGoyal回答的评论中,你说你实际上想知道如何为任何URL生成自己的404响应,而不仅仅是这个示例代码。如果这是真的,你能澄清一下这个问题吗?