2015-10-14 5 views
2

Я использую класс Джанго на основе вида и рамок отдыхаКак переопределить сообщения исключений в рамках Джанго отдыха

object = self.get_object() 

Детальный вид, если объект не существует, и я получаю запрос как

/user/10 

то я получаю этот ответ

{"detail": "not found"} 

Теперь я хочу, чтобы настроить этот ответ

как

try: 
    obj = self.get_object() 
except: 
    raise Exception("This object does not exist") 

Но это еще не работает

ответ

2

Мы можем реализовать custom exception handler function, которая возвращает пользовательский ответ в случае, если объект не существует.

В случае, если объект не существует, Http404 исключение возникает. Итак, мы проверим, было ли поднятое исключение Http404, и если это так, мы вернем наше специальное сообщение об исключении в ответе.

from rest_framework.views import exception_handler 
from django.http import Http404 

def custom_exception_handler(exc, context): 
    # Call REST framework's default exception handler first, 
    # to get the standard error response. 
    response = exception_handler(exc, context) 

    if isinstance(exc, Http404): 
     custom_response_data = { 
      'detail': 'This object does not exist.' # custom exception message 
     } 
     response.data = custom_response_data # set the custom response data on response object 

    return response 

После определения нашего специального обработчика исключений нам нужно добавить этот настраиваемый обработчик исключений в наши настройки DRF.

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler' 
} 
+0

Исключение отклоняется в методе get_object() DRF. Я думаю, что у DRF есть свои собственные попытки, кроме блока. есть ли способ, который, если я использую пример try в верхней части этого, как в моем примере, тогда мое исключение получает повышенное, а не DRF. –

+0

Да, исключение 'Http404' возникает в методе' get_object' DRF. Вы можете использовать метод, указанный в ans, и это должно дать вам такое же сообщение об исключении в ответе, как вы хотите. На всякий случай, если вы хотите переопределить функцию 'get_object', вы можете сделать это в своем представлении, переопределив эту функцию. –