自定义Django rest_framework中response的示例

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

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

# -*- 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 PageNumberPaginationRESPONSE_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 = Noneif 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).datareturn data, headers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87928.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何开发HarmonyOS 5的分布式通信功能?

以下是基于HarmonyOS 5开发分布式通信功能的完整技术指南,涵盖核心流程与关键代码实现: 一、开发前置配置 权限声明‌ 在module.json5中添加分布式权限: {"module": {"requestPermissions": [{"name": &quo…

Linux --静态库和动态库的制作和原理

本章重点: 动静态库的制作,使用和查找 可执行程序ELF格式 可执行程序的加载过程 虚拟地址空间和动态库加载的过程 动静态库的制作,使用和查找 1.在了解库的制作之前,我们首先需要知道什么是库。库是写好的现有的,成…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | IncrementingCounter(递增计数器)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— IncrementingCounter组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup&g…

简约求职简历竞聘工作求职PPT模版共享

简历竞聘&#xff0c;自我介绍&#xff0c;个人简历&#xff0c;工作求职PPT模版&#xff0c;岗位竞聘求职简历PPT模版&#xff0c;低调绿自我介绍PPT模版&#xff0c;简约求职简历PPT模版&#xff0c;个人介绍PPT模版&#xff0c;我的简历PPT模版&#xff0c;个人求职简介PPT模…

Java大厂面试攻略:Spring Boot与微服务架构深度剖析

问题一&#xff1a;Spring Boot 的自动配置原理是什么&#xff1f; 简洁面试回答&#xff1a; Spring Boot 的自动配置基于条件化配置&#xff0c;通过 Conditional 注解实现&#xff0c;根据项目中依赖和环境自动装配 Bean。 详细解析&#xff1a; Spring Boot 自动配置的核…

Windows核心端口攻防全解析:135、139、445端口的技术内幕与安全实践

Windows核心端口攻防全解析&#xff1a;135、139、445端口的技术内幕与安全实践 引言&#xff1a;Windows网络通信的命脉 在Windows网络生态系统中&#xff0c;135、139和445端口犹如网络通信的"大动脉"&#xff0c;承载着关键的系统服务和网络功能。这些端口不仅是…

从生活场景学透 JavaScript 原型与原型链

一、构造函数&#xff1a;以 “人” 为例的对象工厂 1. 生活场景下的构造函数定义 我们以 “人” 为场景创建构造函数&#xff0c;每个人都有姓名、年龄等个性化属性&#xff0c;也有人类共有的特征&#xff1a; // 人类构造函数 function Person(name, age) {this.name na…

学c++ cpp 可以投递哪些岗位

此次描述知识针对应届生来说哈&#xff0c;如果是社招&#xff0c;更多是对于你目前从事的方向&#xff0c;技术栈进行招聘就好了。 此次编写是按照boss上岗位筛选的方式进行编写的&#xff0c;其实投简历一般也是用boss&#xff0c;后面也会出一篇文章给大家介绍一般找工作都用…

【Docker基础】Docker镜像管理:docker rmi、prune详解

目录 引言 1 Docker镜像管理概述 1.1 为什么需要镜像清理&#xff1f; 1.2 镜像生命周期管理 2 docker rmi命令详解 2.1 基本语法 2.2 常用选项 2.3 删除单个镜像 2.4 删除多个镜像 2.5 强制删除镜像 2.6 删除所有镜像 3 docker rmi工作原理 3.1 镜像删除流程 3.…

57-Oracle SQL Profile(23ai)实操

在上一期中说到了SQL Tuning Advisor其中一个影响对象就是SQL Profile&#xff0c;同样在管理和应用开发中,SQL性能优化是个任重道远的工作&#xff0c;低效的SQL语句让应用响应缓慢,用户整体体验下降,拖垮搞蹦整个系统都有可能。Oracle数据库提供了多种组合工具&#xff0c;有…

man的使用

man的使用 文章目录 man的使用基本用法&#xff1a;常见 man 命令操作&#xff1a;man 命令的章节&#xff1a;示例&#xff1a; man 是 Linux 和 macOS 系统中的命令&#xff0c;用于查看命令和程序的手册页&#xff08;manual pages&#xff09;。手册页包含了关于命令、函…

【蓝牙】手机连接Linux系统蓝牙配对,Linux Qt5分享PDF到手机

要实现手机连接 A40i Linux 系统并通过蓝牙接收 PDF 文件&#xff0c;可以按照以下步骤操作&#xff1a; 1. 配置 Linux 蓝牙功能 确保开发板上的蓝牙模块已正确驱动并支持蓝牙协议栈。 安装蓝牙工具&#xff1a; bash sudo apt install bluetooth bluez bluez-tools 启动蓝…

1432. 改变一个整数能得到的最大差值

1432. 改变一个整数能得到的最大差值 题目链接&#xff1a;1432. 改变一个整数能得到的最大差值 代码如下&#xff1a; class Solution { public:int maxDiff(int num) {string s to_string(num);function<int(char, char)> replace_stoi [&](char old_char, cha…

解密 Spring MVC:从 Tomcat 到 Controller 的一次完整请求之旅

今天&#xff0c;想和你聊一个我们每天都在打交道&#xff0c;但可能不曾深入思考的话题&#xff1a;当一个 HTTP 请求从浏览器发出&#xff0c;到最终被我们的 Spring Controller 处理&#xff0c;它到底经历了一场怎样的旅程&#xff1f; 理解这个流程&#xff0c;不仅仅是为…

在 Java 中操作 Map时,高效遍历和安全删除数据

在 Java 中操作 Map 时&#xff0c;高效遍历和安全删除数据可以通过以下方式实现&#xff1a; 一、遍历 Map 的 4 种高效方式 1. 传统迭代器&#xff08;Iterator&#xff09; Map<String, Integer> map new HashMap<>(); map.put("key1", 5); map.pu…

力扣-136.只出现一次的数字

题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {public i…

Go 网络编程:HTTP服务与客户端开发

Go 在标准库中内置了功能强大的 net/http 包&#xff0c;可快速构建高并发、高性能的 HTTP 服务&#xff0c;广泛应用于微服务、Web后端、API中间层等场景。 一、快速创建一个HTTP服务 示例&#xff1a;最简Hello服务 package mainimport ("fmt""net/http&quo…

【Prism】 实现注入的几个标准化步骤(相机举例)

📸 Prism 架构中如何优雅地注册和注入相机服务 在开发基于 Prism + WPF 的应用时,合理使用依赖注入(DI)可以大大提高系统的可维护性和扩展性。本文以一个多相机平台管理系统为例,展示如何通过接口、枚举、容器注册等方式,实现相机服务的灵活配置与使用。 🧩 一、定义…

vue3组件式开发示例

1&#xff0c;定义组件&#xff08;根据实际调整提交分析结果方法&#xff09; <template><!-- 分析结果上传对话框组件 --><el-dialogv-model"uploadResultDialog":title"title":width"width":before-close"handleBeforeC…

基于arm linux的bluealsa开启蓝牙A2DP和SCO录音功能

bluealsa的软件架构 #mermaid-svg-ohITacCRHItwRR1t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ohITacCRHItwRR1t .error-icon{fill:#552222;}#mermaid-svg-ohITacCRHItwRR1t .error-text{fill:#552222;stroke:…