Django REST框架:如何使用额外的字段包装响应....并在数据字段中提供当前响应 [英] Django REST framework: how to wrap the response with extra fields .... and supply the current response in data field

查看:47
本文介绍了Django REST框架:如何使用额外的字段包装响应....并在数据字段中提供当前响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我有以下内容:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆