2

Технология используется:Включить данные запроса в данном ответ пользовательских обработчиков исключений Django Framework Rest

http://www.django-rest-framework.org

Исключение:http://www.django-rest-framework.org/api-guide/exceptions/

Включенного пример rest_framework по умолчанию в пользовательском файле exceptions.py:

from rest_framework.views import exception_handler 

import sys 

def custom_exception_handler(exc, context=None): 

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

    # Now add the HTTP status code to the response and rename detail to error 
    if response is not None: 
     response.data['status_code'] = response.status_code 
     response.data['request'] = request 
     response.data['error'] = response.data.get('detail') 
     del response.data['detail'] 

    return response 

Отсылает основную информацию об ошибке, такую ​​как «Http404» и т. Д., Но нет данных запроса, например, IP-адрес и т. Д.

Лучший способ добавить мой запрос в ответ? Заранее спасибо.

UPDATE (и решается):

Итак, я хотел решить это с помощью DjangoRestFramework 2.4.x, но эта версия не имеет запроса или контекстные варианты данных для обработчика пользовательских исключений. Обновление до 3.1.3 упростило добавление данных в ответ. Новый код теперь выглядит следующим образом (с использованием версии 3.1.3):

def custom_exception_handler(exc, request): 

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

# Send error to rollbar 
rollbar.report_exc_info(sys.exc_info(), request) 

# Now add the HTTP status code to the response and rename detail to error 
if response is not None: 
    response.data['status_code'] = response.status_code 
    response.data['error'] = response.data.get('detail') 
    del response.data['detail'] 

return response 
+0

Пожалуйста, проверьте отступы ' response = exception_handler (exc) '. Правильно ли это? –

+1

Спасибо Rahul - да, это правильно - просто выглядит неправильно с тем, как я вставлял его здесь –

ответ

3

Это должно работать на ваш случай.

from rest_framework.views import exception_handler 

import sys 

def custom_exception_handler(exc, context=None): 

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

    # Now add the HTTP status code to the response and rename detail to error 
    if response is not None: 
     response.data['status_code'] = response.status_code 
     response.data['request'] = context['request'] 
     response.data['error'] = response.data.get('detail') 
     del response.data['detail'] 

    return response 

Вы можете получить доступ к request из контекста, переданного в custom_exception_handler. Он был добавлен в DRF 3.1.0. Также обратитесь к этому issue, где он был разрешен.

Если вы используете DRF < 3.1, в контексте обработчика исключений не будет request. Вы можете перейти на DRF 3.1.3 (последняя версия в PyPI), а затем легко получить доступ к request в контексте.

Взятые из ФПИ 3.1.1 исходного кода:

def get_exception_handler_context(self): 
    """ 
    Returns a dict that is passed through to EXCEPTION_HANDLER, 
    as the `context` argument. 
    """ 
    return { 
     'view': self, 
     'args': getattr(self, 'args',()), 
     'kwargs': getattr(self, 'kwargs', {}), 
     'request': getattr(self, 'request', None) 
    } 

Кроме того, необходимо настроить обработчик исключений в файле settings.py.

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

Если он не указан, 'EXCEPTION_HANDLER' настройки по умолчанию стандартного обработчика исключений, предоставляемые рамках REST:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' 
} 

Примечание:

Exception handler will only be called for responses generated by raised exceptions. It will not be used for any responses returned directly by the view, such as the HTTP_400_BAD_REQUEST responses that are returned by the generic views when serializer validation fails.

+0

Спасибо Rahul - у меня на самом деле есть это уже, но запрос нужно определить ... –

+1

Hi Rahul - yup Я добавил обработчик исключений мой файл settings.py уже слишком - но все равно не могу получить эту информацию ...спасибо agian за вашу помощь –

+0

Попробуйте обратиться к 'запросу' по' context ['request'] ', если это работает. –