Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django REST中引发异常_Django - Fatal编程技术网

在Django REST中引发异常

在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

我试图在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 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响应,而不仅仅是这个示例代码。如果这是真的,你能澄清一下这个问题吗?