Python 更改django rest框架中的默认身份验证消息

Python 更改django rest框架中的默认身份验证消息,python,django,django-rest-framework,Python,Django,Django Rest Framework,在Django Rest框架中的一个简单的TokenAuthentication系统中,当您无法发送正确的授权令牌时,默认消息如下 { "detail": "Authentication credentials were not provided." } 我希望所有API响应都遵循某个模板,例如{success,message,data} 如何覆盖此错误消息? 创建这些API模板时的最佳实践是什么? 另外,我查了其他问题,但找不到有类似问题的人。如果已经回答了,我很高兴您能给我指一下。如果您需

在Django Rest框架中的一个简单的
TokenAuthentication
系统中,当您无法发送正确的授权令牌时,默认消息如下

{
"detail": "Authentication credentials were not provided."
}
我希望所有API响应都遵循某个模板,例如
{success,message,data}

如何覆盖此错误消息? 创建这些API模板时的最佳实践是什么?
另外,我查了其他问题,但找不到有类似问题的人。如果已经回答了,我很高兴您能给我指一下。

如果您需要更改默认消息,一种方法是实现您自己的错误处理程序,如下所示:

#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的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"
无例外的响应

您可以使用助手函数。像这样的

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
            }
        }
在每个响应的返回语句中,使用:
返回响应(render\u Response(True,data=serializer.data),status=status.200\u OK)

这将给

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

这可以是您的标准格式。

看看这个。这是关于覆盖drf中的默认异常:[谢谢@Winston!关于第二个问题,是否有一种通用的方法来模板化我的所有响应?您可以通过实现您自己的异常类并抛出它们,还可以使用您自己的异常处理程序来实现您想要的,正如我上面所说的。我指的是响应不是异常的情况?对于成功的请求,是存在的一种方法,我可以模板它像这些例外?请看一看,再次感谢,这正是我要找的!