Django Rest Framework自定义响应消息

时间:2016-02-19 08:56:16

标签: python django django-rest-framework

我有两个关于Django Rest Framework响应消息的问题

1

使用generics.ListCreateAPIViewRetrieveDestroyAPIView时,通常会返回资源

例如,使用POST方法调用/ map / 结果将像一个对象:

{
    "x_axis": "23",
    "y_axis": "25",
    "map_id": 1,
}

我想知道我可以将此邮件编辑为自定义,如下所示吗?

{"Success":"msg blablabla"}

2。

当我使用serializers.ValidationError时, 我可以写我的自定义消息 如果我使用raise serializers.ValidationError("map_id does not exist") 响应消息将是

{"map_id":["map_id does not exist"]}

我可以将此部分编辑为自定义,如下所示吗?

{"FAIL":"map_id does not exist"}

我想知道这一点,因为前端并不想要这种格式, 他们喜欢:

{"Success":"msg blablabla"}
{"Fail":"msg blablabla"}
{"USERNAME_DUPLICATE":1001}
{"FIELD_REQUIRED":1002}

那么他们可以更方便地告诉用户操作错误原因吗?

1 个答案:

答案 0 :(得分:11)

1在视图上覆盖create方法并输入如下内容:

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers)

2在上面的代码中,将raise_exception更改为False并在序列化程序无效时返回您想要的任何内容。即:

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            return Response({"Fail": "blablal", status=status.HTTP_400_BAD_REQUEST)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers)

您正在使用CBV,因此您可以创建扩展DRF课程的自定义通用课程,以及DRY

但是,我说你不应该添加成功"或"失败"在你的回复中...如果http代码是2xx,用户会知道它没问题,4xx请求有问题,5xx当你的代码(或服务器)出错时,你不需要要在您的回复正文中重复该信息,只需使用HTTP状态代码

希望这有帮助