我想要重写 Django REST Framework 的 Response
类,以便响应反馈包含三个参数的字典:message
、status
和 data
。
大家好
我尝试更改 DRF 中的 Response Class
,以通过 DRF 序列化器提供的数据传递两个额外的参数(信息和状态)。message
参数用于传递信息,如 Done
、User Created
等等。而 status
参数用于传递特殊状态代码,例如 fail
或者 success
。这些信息对前端和后端之间的保留非常有用。
如果没有设置这些参数,我希望返回空字符或 null 结果到客户端。
例如,在成功模式下:
{
'data': {
'value_one': 'some data',
'value_two': 'some data',
'value_three': [
'value', 'value', 'value'
],
},
}
'message': 'Done',
'status': 'success',
}
在失败模式下:
{
'data': ['any error message raise by serializer',]
'message': 'Create User Failed',
'status': 'failure',
}
我搜索了我的问题并找到了这个解决方案:
如果我在我的类中继承DRF Response Class
,并重写__init__
方法,在这个方法中获取消息、数据和状态,并调用父类的init
方法来使用自己的数据结构,并在我的功能中使用这个响应类来实现:
from rest_framework.response import Response
class Response(Response):
def __init__(self, data=None, message=None, data_status=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
data_content = {
'status': data_status,
'data': data,
'message': message,
}
super(Response, self).__init__(
data=data_content,
status=status,
template_name=template_name,
headers=headers,
exception=exception,
content_type=content_type
)
在成功模式下调用:
return Response(data=serializer.data, message='Done', data_status='success', status=200)
在故障模式下调用:
return Response(data=serializer.errors, message='Create User Failed', data_status='failure', status=400)
在所有视图中使用自己的响应类。我们在这个解决方案中遇到了一个问题:如果我们使用通用视图类,必须覆盖视图逻辑中使用的所有HTTP方法并调用自己的类,这样就不符合DRY原则。
我找到的另一个解决方案是,在序列化层中,我们有一个抽象方法def to_representation(self, instance):
在Serializer
类中实现,然后在其他类中实现,例如继承Serializer
的ModelSerializer
类,如果我们在自己的序列化器类中重写这个方法,并在发送到视图层之前重新获取数据,就可以实现如下:
from collections import OrderedDict
class OurSerializer(serializer.ModelSerializer):
....
def to_representation(self, instance):
data = super(serializers.ModelSerializer, self).to_representation(instance)
result = OrderedDict()
result['data'] = data
result['message'] = 'Done'
result['status'] = 'sucssed'
return result
这个解决方案解决了上述问题,但我们又遇到了两个问题:
第一,如果我们使用嵌套序列化器并且在序列化器类中覆盖了此函数,则会返回错误的数据,例如:
{
'data': {
'value_one': 'some data',
'value_two': 'some data',
'value_three': {
'data': [
'value', 'value', 'value'
],
'message': 'Done',
'status': 'sucssed',
},
}
'message': 'Done',
'status': 'sucssed',
}
而且 message
和 status
的重复出现,以及结构对客户端不够友好。
其次,在此模式下我们无法处理异常,并且仅能通过类似于这样的中间件处理异常:DRF Exception Handling,这种方式并不实用,因为我们无法处理视图中出现的任何类型的错误,并生成舒适的分离的message
和status
。
如果有其他好的解决方法,请指导我。
谢谢 :)