Django rest_framework:如何将其他属性传递给异常/错误响应?

时间:2018-08-21 09:14:11

标签: python django django-rest-framework

我正在将Python 3.6与Django 1.11.9和rest_framework 3.6.2结合使用。

我有一个视图(APIView),只有成功通过给定的HasUnlimitedAccesPermission检查的某些用户才能访问该视图。如果无法通过后者,我会提出一个PermissionDenied,其中包含我选择的有关错误的详细消息,该错误将传递给前端。到目前为止,到目前为止,通过使用“ permission_classes”修饰符将HasUnlimitedAccessPermission应用于我的视图,所有这些都可以轻松实现(是的,我在这里使用基于function_view的视图)。

现在,我要实现的是将一个附加属性传递给我的错误响应JSON(当用户未能通过权限测试时)。该属性将是“ error_id”属性,该属性将使前端开发人员能够根据“ error_id”值来调整错误显示。响应JSON的示例为:

{
    "error": "To enjoy this feature, go pick one of our pay offer!",
    "error_id": "no_unlimited_access"
}

关于如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:0)

您的问题可以使用中间件问题来解决。

我建议您构建自定义中间件。因此,自定义中间件可以帮助您根据需要创建响应。只需将中间件插入django应用程序即可。

您可以在this blogthis blog

中了解更多信息

答案 1 :(得分:0)

自定义例外类定义为

from rest_framework.serializers import ValidationError
from rest_framework import status


class CustomAPIException(ValidationError):
    """
    raises API exceptions with custom messages and custom status codes
    """
    status_code = status.HTTP_400_BAD_REQUEST
    default_code = 'error'

    def __init__(self, detail, status_code=None):
        self.detail = detail
        if status_code is not None:
            self.status_code = status_code

并在视图中用作

from rest_framework import status


def my_view(request):
    if some_condition:
        error_msg = {
            "error": "To enjoy this feature, go pick one of our pay offer!",
            "error_id": "no_unlimited_access"
        }
        raise CustomAPIException(error_msg)

答案 2 :(得分:0)

好的,感谢贝尔·布朗的评论和杰林·彼得·乔治的回答(由rest_framework源代码完成),我做到了:

1)创建了一个自定义PermissionDenied异常:

class CustomPermissionDenied(PermissionDenied):

    def __init__(self, detail=None, code=None, error_id=None):
        super().__init__(detail=detail, code=code)
        self.error_id = error_id
例如,在HasUnlimitedAccessPermission中引发的

raise CustomPermissionDenied(detail=_("To use this feature, subscribe to one of our plans."),
                             error_id="no_unlimited_access")

2)在custom_exception_handler(我已经有其他用途)中,在椭圆之间添加了行

def custom_exception_handler(exc, context):
    ...
    error_id = getattr(exc, "error_id", None)
    if error_id is not None:
        new_response_data["error_id"] = error_id
    ...
    response.data = new_response_data

return response

这就是我想要的错误响应格式。感谢大家的帮助!