自定义Django rest_framework中response的示例

在实际项目开发中,原有框架的response可能并不能完全满足我们的需求。比如我们需要定义一些更加详细的RESULT_CODE来说明情况。那么我们就可以基于原有的response进行自定义。

下面是一个自定义Django rest_framework中response的示例

python 复制代码
# -*- coding:utf-8 -*-
import json
from rest_framework.response import Response
from rest_framework.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND, HTTP_401_UNAUTHORIZED, \
    HTTP_402_PAYMENT_REQUIRED, HTTP_400_BAD_REQUEST, HTTP_500_INTERNAL_SERVER_ERROR, HTTP_200_OK
from rest_framework.pagination import PageNumberPagination

RESPONSE_STATUS = [200, 400, 401, 403, 404, 500]
RESULT_CODE_DICT = {
    200: {
        '0': '成功',
    },
    400: {
        '10000': '请求参数无效',
        '10001': '资源存在,无需重复创建',
        '10002': '参数缺失',
    },
    401: {
        '10100': '用户需要登录:Token无效或缺失',
        '10101': '用户冻结',
        '10102': 'Token无效',
        '10103': 'Token缺失',
        '10104': 'Authentication Key无效',
        '10105': 'Token过期'
    },
    403: {
        '10300': '没有权限访问',
        '10301': '权限密钥无效',
    },
    404: {
        '10400': '所请求的资源不存在'
    },
    500: {
        '10500': '系统错误'
    }
}


# 基于rest_framework的Response
def api_success(data=None, message='', headers=None):
    if not message:
        message = '成功'
    return Response(
        {'result': True, 'result_code': '0', 'result_text': str(message), "message": str(message), 'data': data},
        status=HTTP_200_OK, headers=headers)


def api_bad_request(message=''):
    if not message:
        message = '请求参数有误'
    return Response({'result': False, 'result_code': '10000', 'result_text': str(message), "message": str(message)},
                    status=HTTP_400_BAD_REQUEST)


def api_request_params_required(params):
    if not params:
        message = '检查请求参数是否完整'
    else:
        if isinstance(params, str):
            params = (params,)
        message = '参数:{}为必填'.format(','.join(params))
    return Response({'result': False, 'result_code': '10002', 'result_text': str(message), "message": str(message)},
                    status=HTTP_400_BAD_REQUEST)


def api_repeated_request(message=''):
    if not message:
        message = '资源存在,无需重复创建'
    return Response({'result': False, 'result_code': '10001', 'result_text': str(message), "message": str(message)},
                    status=HTTP_400_BAD_REQUEST)


def api_unauthorized(message=''):
    if not message:
        message = '用户登录验证失败'
    return Response({'result': False, 'result_code': '10100', 'result_text': str(message), "message": str(message)},
                    status=HTTP_401_UNAUTHORIZED)


def api_invalid_authentication_key(message=''):
    if not message:
        message = 'Authentication Key无效'
    return Response({'result': False, 'result_code': '10104', 'result_text': str(message), "message": str(message)},
                    status=HTTP_401_UNAUTHORIZED)


def api_authentication_expired(message=''):
    if not message:
        message = 'Token过期'
    return Response({'result': False, 'result_code': '10105', 'result_text': str(message), "message": str(message)},
                    status=HTTP_401_UNAUTHORIZED)


def api_suspended(message=''):
    if not message:
        message = '用户冻结'
    return Response({'result': False, 'result_code': '10101', 'result_text': str(message), "message": str(message)},
                    status=HTTP_401_UNAUTHORIZED)


def api_permissions_required(permissions=None):
    if not permissions:
        message = '没有权限访问'
    else:
        if isinstance(permissions, str):
            permissions = (permissions,)
        message = '缺失权限:{}'.format(','.join(permissions))
    return Response({'result': False, 'result_code': '10300', 'result_text': str(message), "message": str(message)},
                    status=HTTP_403_FORBIDDEN)


def api_invalid_permission_key(message=''):
    if not message:
        message = '权限验证失败'
    return Response({'result': False, 'result_code': '10301', 'result_text': str(message), "message": str(message)},
                    status=HTTP_403_FORBIDDEN)


def api_not_found(message=''):
    if not message:
        message = '所请求的资源不存在'
    return Response({'result': False, 'result_code': '10400', 'result_text': str(message), "message": str(message)},
                    status=HTTP_404_NOT_FOUND)


def api_error(message=''):
    if not message:
        message = '系统错误'
    return Response({'result': False, 'result_code': '10500', 'result_text': str(message), "message": str(message)},
                    status=HTTP_500_INTERNAL_SERVER_ERROR)


def build_pagination_response(request, queryset, serializer_class):
    data, headers = build_pagination_queryset_data(request, queryset, serializer_class)
    return api_success(data=data, headers=headers)


def build_pagination_queryset_data(request, queryset, serializer_class):
    """
    为分页接口返回的headers中自定义一些信息
    :param request:
    :param queryset:
    :param serializer_class:
    :return:
    """
    page = request.GET.get('page', None)
    page_size = request.GET.get('page_size', None)
    total = len(queryset)
    headers = None
    if page and page_size:
        paginator = PageNumberPagination()
        paginator.page_size_query_param = 'page_size'
        queryset = paginator.paginate_queryset(queryset, request)
        pagination_params = json.dumps({'total': total, 'page': int(page), 'page_size': int(page_size)})
        headers = {'X-Pagination': pagination_params,
                   'Access-Control-Expose-Headers': 'X-Pagination'}
    data = serializer_class(queryset, many=True).data
    return data, headers
相关推荐
8***29316 分钟前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
ChoSeitaku6 分钟前
线代强化NO19|矩阵的相似与相似对角化
python·线性代数·矩阵
sniper_fandc18 分钟前
Coze智能体实现人生模拟器
python·ai·agent·coze
IT_陈寒28 分钟前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
white-persist32 分钟前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
FeiHuo5651532 分钟前
微信个人号开发中如何高效实现API二次开发
java·开发语言·python·微信
love530love34 分钟前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar
Qiuner1 小时前
Spring Boot 机制二:配置属性绑定 Binder 源码解析(ConfigurationProperties 全链路)
java·spring boot·后端·spring·binder
Victor3561 小时前
Redis(151)Redis的内存使用如何监控?
后端
Victor3561 小时前
Redis(150)Redis的性能瓶颈如何排查?
后端