Ярлык Django get_object_or_404 внутри Django Rest framework Представления на основе классов - PullRequest
0 голосов
/ 05 ноября 2018

Функция ярлыка get_object_or_404 в Django при обнаружении исключения выдает очень приятное сообщение об ошибке в следующем формате:

'No %s matches the given query.' % queryset.model._meta.object_name)

Однако, при использовании этого в представлении на основе класса DRF 3.X, окончательные данные ответа 404 имеют очень урезанную версию, которая выглядит следующим образом:

{"detail": "Not found."}

Как видно, сообщение DRF является очень общим, без информации о названии модели. Я предполагаю, что DRF NotFound Определенный класс исключений здесь сокращает сообщение до его текущий минимум.

Как я могу получить оригинальное приятное сообщение об ошибке, которое Django возвращает несмотря на использование его в представлении на основе классов DRF?

1 Ответ

0 голосов
/ 05 ноября 2018

Обработчик исключений по умолчанию для класса APIView определяется методом get_exception_handler. Т.е.,

def get_exception_handler(self):
    """
    Returns the exception handler that this view uses.
    """
    return self.settings.EXCEPTION_HANDLER

Другими словами, функция-обработчик, используемая классом APIView по умолчанию, равна rest_framework.views.exception_handler (которая указана в default settings).

Согласно документу DRF

По умолчанию DRF обрабатывает структуру REST APIException, и также в Django встроены Http404 и PermissionDenied исключения.

Поскольку в этом случае вы хотите настроить сообщение об ошибке только для Http404, вы можете создать свой собственный обработчик, подобный этому.

е

from rest_framework.views import exception_handler

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)

    # Now overide the error message.
    if response is not None and isinstance(exc, Http404):
        # set the custom message data on response object
        response.data['detail'] =  exc.args[0] # exc.args[0] will have the message text, 

    return response

Затем поместите этот пользовательский обработчик в настройки вашего проекта.

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

Примечание: Это решение не тестировалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...