Изменение сообщения аутентификации по умолчанию в django -rest-framework - PullRequest
1 голос
/ 25 апреля 2020

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

{
"detail": "Authentication credentials were not provided."
}

Я хочу, чтобы все мои ответы API следовали определенному шаблон например { success, message, data }

Как мне перезаписать это сообщение об ошибке?

Какова лучшая практика при создании этих шаблонов API?

PS Я проверил другие вопросы, но не смог не найти никого с подобной проблемой. Если на него уже ответили, я был бы рад, если бы вы могли указать мне на это.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Для ответа без исключения

вы можете использовать вспомогательную функцию. что-то вроде этого.

def render_response(success, data=None, item=None, items=None, err_name=None,
                    err_message=None):
    if success:
        if data is not None:
            return {
                "success": True,
                "data": data
            }
        elif item is not None:
            return {
                "success": True,
                "data": {
                    "item": item
                }
            }
        elif items is not None:
            return {
                "success": True,
                "data": {
                    "items": items
                }
            }
    else:
        return {
            "success": False,
            "error": {
                "name": err_name,
                "message": err_message
            }
        }

и в своем выражении возврата для каждого ответа используйте: return Response(render_response(True, data=serializer.data), status= status.200_OK)

это даст

{
    "success": true,
    "data": {
      ...
    }
}

, и это может быть вашим стандартом формат.

0 голосов
/ 25 апреля 2020

Если вам нужно изменить сообщение по умолчанию, один из способов - реализовать собственный обработчик ошибок, как показано ниже:

#your_app/error_handler.py
def custom_exception_handler(exc, context):
      ....
      # ovverride IsAuthenticated permission class exception
      if(response.data['detail'].code == 'not_authenticated'):
          response.data['code'] = Unauthorized.default_code
          response.data['message'] = Unauthorized.default_detail
          del response.data['detail']

      return response

Также не забудьте добавить собственный обработчик ошибок в Django ' s settings.py

REST_FRAMEWORK = {
    "EXCEPTION_HANDLER": ("your_app.error_handler.custom_exception_handler")
}

Кроме того, вы можете реализовать пользовательские классы исключений. Например:

class UnreadableCSVFile(APIException):
    status_code = 400
    default_detail = "Unable to read file."
    default_code = "unreadable_csv_file"
...