Django REST框架:如何使用额外的字段包装响应....并在数据字段中提供当前响应 [英] Django REST framework: how to wrap the response with extra fields .... and supply the current response in data field
问题描述
所以,我有以下内容:
class ObjectViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
"""
REST API endpoints for Objects.
"""
serializer_class = ObjectSerializer
queryset = Object.objects.all()
例如,这返回列表 GET
请求:
This returns, say, for a list GET
request:
[
{
"uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
},
{
"uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
}
]
但是,我如何稍微改变mixins的响应,使其类似于以下内容:
However, how could I slightly alter this response for mixins to be similar to the following:
{
success: true,
message: 'Some Extra Useful Message',
data: [
{
"uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
},
{
"uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
}
]
}
这是否可行,还是应该只编写自己的自定义终结点 Response()
而不使用DRF的 mixins
功能?
Is this possible, or should I just write my own custom endpoint Response()
and not utilise DRF's mixins
capability?
因此,从本质上讲,切换自定义:
So, essentially, switching the custom:
Response(data, status=None, template_name=None, headers=None, content_type=None)
收件人:
response = {
'success': true,
'message': 'Some Extra Useful Message',
'data': serializer.data
}
Response(response, status=None, template_name=None, headers=None, content_type=None)
推荐答案
您可以使用 Middelwares
处理此响应格式.如果基于状态码,您具有固定的响应格式,则编写中间件.
You can handle this response format using Middelwares
. If based on status code you have a fixed format for a response, then write a middleware.
class ResponseFormatMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
try:
if (not getattr(response, 'error', False)) and (isinstance(response.data, dict) or isinstance(response.data, list)):
response.data = {'success': True, 'message':'some message','data': response.data}
except AttributeError:
pass
return response
中间件在 CustomMiddleware
模块中写为 middleware.py
,然后添加
Middleware is written in CustomMiddleware
module as middleware.py
, then add
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'CustomMiddleware.middleware.ResponseFormatMiddleware', # Added this line
]
在 settings.py
文件中.
这篇关于Django REST框架:如何使用额外的字段包装响应....并在数据字段中提供当前响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!