2015-08-01 3 views
4

Я пытаюсь проверить исключения в рамках django rest. основе http://www.django-rest-framework.org/api-guide/exceptions/ повышающего NotFound,Повышение исключений в Django REST

По умолчанию это исключение приводит ответ с 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

В комментариях к @ Ответ ArpitGoyal, который вы говорите, вы действительно хотите знать, как генерировать собственный ответ 404 для любого URL, а не только этот пример кода. не могли бы вы прояснить вопрос, если это правда? –

ответ

9
from rest_framework.exceptions import NotFound 

Класс NotFound вытянута от APIException. Код состояния по умолчанию для APIException: 500 Internal Server Error, а для NotFound - 404.

Так что, согласно мне, вы пытаетесь выбросить исключение rest framework в чистом виде django. Я написал здесь тестовый пример, чтобы проверить, какие шансы получить сообщение об ошибке. Угадайте, что простое представление django, пытающееся поднять исключение rest framework, не считается ошибкой представления. Но о предоставлении декоратора и объявления его API View он входит в exception_handler

Так что, когда вы делаете:

from rest_framework.decorators import api_view 

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

Это в настоящее время признается в качестве исключения, брошенной в API, который входит по умолчанию rest_frameworkEXCEPTION_HANDLER обеспечивается вы, где он возвращает ответ для любого данного исключения.

Его docstring говорит:

Возвращает ответ, который должен быть использован для любого данного исключения. По умолчанию по умолчанию мы обрабатываем раму REST APIException, а также Django: ValidationError, Http404 и PermissionDenied исключений. Любые необработанные исключения могут возвращать None, что приведет к ошибке .

+0

Хорошо круто. Имеет смысл. Кроме того, если я затем брошу запрос для/example2, если это не приведет NotFound к DRF без необходимости настраивать что-либо еще. – felix001

+0

Поведение должно быть одинаковым для каждого URL-адреса, если код остается прежним. –

+0

ОК, я должен что-то пропустить, так как не могу получить его, чтобы автоматически генерировать ответ 404 JSON – felix001

1

Я не уверен, почему вы это делаете. Это внутреннее исключение, используемое DRF, когда он не может найти ресурс. Но вы используете его в стандартном представлении Django, вне любого из механизмов DRF. Если вы хотите сделать это, вы должны использовать стандартное исключение Django:

from django.core.exceptions import Http404 

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

Попробуйте изменить свой адрес с reqular выражением, которое соответствует всем возможным URLs и поместить его в конце основного urls.py

для экс:

urlpatterns = [ 
url(r'^(?P<slug>[\w-]+)/', views.example1), 
] 
Смежные вопросы