【发布时间】:2019-05-23 10:43:07
【问题描述】:
我想覆盖 django rest 框架的 Response 类,以便响应返回响应字典包含三个参数 message、status 和 data
大家好
我尝试更改 DRF 中的 Response Class 以传递两个额外的参数(消息、状态)以及 DRF 序列化程序提供的数据。 message 传递Done、User Created 等消息,status 传递fail 或success 等消息,此消息可用于在前端和后端之间保留特殊代码。
我想如果不设置这个参数返回空字符或空结果返回客户端
例如在成功模式下:
{
'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)
并在所有视图类中使用自己的响应类
我们在这个解决方案中有problem:如果我们使用GenericViews Class,必须覆盖我们在视图逻辑中使用的所有http方法并调用自己的类,这是DRY!!
以及我找到的其他解决方案。在序列化层中,我们在Serializer 类中有抽象方法def to_representation(self, instance): 并在其他类中实现,例如ModelSerializer 类继承Serializer,如果我们在序列化程序类中覆盖此方法并在发送到视图层之前重新获取数据,像这样实现:
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。
如果这个问题还有其他好的解决方案,请指导我。
谢谢:)
【问题讨论】:
-
如何编写自定义中间件?通常这是一个通过请求/响应实现事情的好地方。
标签: python django django-rest-framework response django-generic-views