drf-过滤、排序、异常处理、自封装Response

过滤

过滤就是根据路由url?后的信息过滤出符合?后条件的数据而非全部,比如…/?name=weer就是只查name是weer的数据,其余不返回。

1、安装:pip3 install django-filter2、注册:在settings.py中的app中注册'django-filter'3、使用全局配置:还是在REST_FRAMEWORK中写:'DEFAULT_FILTER_BACKENDS':['django_filters.rest_framework.DjangoFilterBackend']然后在需要使用的视图类中写:filter_fields = ('name', )       # 指定可过滤字段,一般都用在查中局部配置也是在视图类下配置filter_backends = […],同方法嘛

排序

就是将查出来的数据按某某排序展示,比如按价格升序、按id降序

是依赖于django-filter实现的,所以前面安装过这不再书写了

也是可全局使用和局部使用

此介绍局部使用:

views.pyfrom rest_framework.filters import OrderingFilterclass BookView(ListAPIView):queryset = models.Book.objects.all()serializer_class = BookSerializerfilter_backends = [OrderingFilter]ordering_fields = ('id', 'price') # 指定可用排序字段# 使用时路由url中?后应带固定关键字比如ordering=id,支持降序就是加负号-比如/?ordering=-price就是按价格降序展示

异常处理

通过前面的经验,当我们写项目的时候出现错误,drf或Django会自动帮你处理错误并返回你它自己设置的错误信息或页面。但在实际项目开发中,我们写接口文档会根据自己公司的要求来自定义错误信息,并且一般都返回字典json格式,里面包括什么状态码、出错信息、headers啊等,而不是像Django给你出现的如下页面错误信息:

drf中的自动帮你处理错误信息的方法在rest_framework.views.exception_handler中:

def exception_handler(exc, context):# exc就是异常信息对象, context可以取出视图函数来if isinstance(exc, Http404):exc = exceptions.NotFound()elif isinstance(exc, PermissionDenied):exc = exceptions.PermissionDenied()if isinstance(exc, exceptions.APIException):headers = {}if getattr(exc, 'auth_header', None):headers['WWW-Authenticate'] = exc.auth_headerif getattr(exc, 'wait', None):headers['Retry-After'] = '%d' % exc.waitif isinstance(exc.detail, (list, dict)):data = exc.detailelse:data = {'detail': exc.detail}set_rollback()return Response(data, status=exc.status_code, headers=headers)return None"""
研究源码可以看到,drf自动帮你处理了404、是否允许访问,还有APIException错误信息,
另一个返回结果None就很灵性,意味着该异常处理不全,返回None的交给了Django处理,
因此展示那种错误页面
"""

因此我们需要写自己的异常处理方法,一是为了统一错误信息返回格式,二是为了记录错误日志

当然,像APIException错误这种,drf已然帮我们写好了,为此我们可以直接用

我是新建的my_exception_handler.py:

from rest_framework.views import exception_handler
from rest_framework.views import Response
from rest_framework import statusdef my_exception_handler(exc, content):response = exception_handler(exc, content) # 沿用exception_handler处理方法 返回None时就是写我们自己的,没有返回None时就是对APIException处理了的if not response:# 写自己的异常处理逻辑 按需求来# 以下为示例return Response(data={'code':104,'msg':str(exc)}, status=status.HTTP_400_BAD_REQUEST)else:# 这返回的是drf内置的处理错误信息,如APIException的return Response(data={'code':101,'msg':response.data.get('detail')}, status=status.HTTP_403_FORBIDDEN)

然后去REST_FRAMEWORK中全局配置,没有局部配

'EXCEPTION_HANDLER':'app01.my_exception_handler.my_exception_handler'

对应着来之后只要出现异常都返回类似这种格式的了:

自封装Response对象

虽然drf提供的Response对象已经包含了很多功能,比如data, status,template_name, headers,exception,content_type这种,但其可扩展性还是不高,需要结合项目需求来,比如要加一个token字段跟在其后便没有办法,因此也是在实际开发中,我们都需要自己封装一个Response对象,不过继承了原生Response对象而已,以实现更多需求

下为一个简单示例↓

class APIResponse(Response):def __init__(self,code=200,msg='成功',data=None, status=None,headers=None,**kwargs):dic = {'code':code, 'msg':msg}dic.update(kwargs)super().__init__(data=dic,status=status,headers=headers)

以后我们一般都使用自己的Response对象,因为要啥功能自己配就行了。

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

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

相关文章

服务器数据恢复-某银行服务器硬盘数据恢复案例

服务器故障&分析: 某银行的某一业务模块崩溃,无法正常使用。排查服务器故障,发现运行该业务模块的服务器中多块硬盘离线,导致上层应用崩溃。 故障服务器内多块硬盘掉线,硬盘掉线数量超过服务器raid阵列冗余级别所允…

【T3】畅捷通T3备份账套提示:超时已过期,错误‘53‘文件不存在。

【问题描述】 针对畅捷通T3软件,进行账套备份(账套输出)的时候, 先是提示”超时已过期“; 点击确定后,再次提示:运行时错误53,文件未找到。 最终导致账套备份/输出失败。 【解决…

windows10下pytorch环境部署留念

pytorch环境部署留念 第一步:下载安装anaconda 官网地址 (也可以到清华大学开源软件镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/) 我安装的是下面这个,一通下一步就完事儿。 第二步&#x…

Java中配置RabbitMQ基本步骤

在Java中配置RabbitMQ&#xff0c;需要遵循以下步骤&#xff1a; 1.添加依赖 在项目的pom.xml文件中添加RabbitMQ的Java客户端依赖&#xff1a; <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><versio…

NLP入门——语言结构/语言建模

一、Linguistics 语言学 wordsmorphology 形态学&#xff1a;词的构成和内部结构研究。如英语的dog、dogs和dog-catcher有相当的关系morpheme 语素&#xff1a;最小的语法单位&#xff0c;是最小的音义结合体lexeme 词位&#xff1a;词的意义的基本抽象单位&#xff0c;是一组…

Scala入门到放弃—02—函数

文章目录 函数方法定义默认参数命名参数可变参数条件语句循环表达式 函数 方法定义 def 方法名(参数: 参数类型): 返回值类型 {//方法体//最后一行作为返回值(不需要使用return) } def max(x: Int, y: Int): Int {if(x > y)xelse y }package org.example object App {de…

2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

文章目录 一、意义二、功能三、作用四、游戏房间类基本框架五、游戏房间管理类基本框架七、游戏房间类代码八、游戏房间管理类代码 一、意义 对匹配成功的玩家创建房间&#xff0c;建立起一个小范围的玩家之间的关联关系&#xff01; 房间里一个玩家产生的动作将会广播给房间里…

基本的爬虫工作原理

爬虫是一种自动化程序&#xff0c;能够模拟人类的浏览行为&#xff0c;从网络上获取数据。爬虫的工作原理主要包括网页请求、数据解析和数据存储等几个步骤。本文将详细介绍爬虫的基本工作原理&#xff0c;帮助读者更好地理解和应用爬虫技术。 首先&#xff0c;爬虫的第一步是…

I/O模型之非阻塞IO

简介 五种IO模型   阻塞IO   非阻塞IO   信号驱动IO   IO多路转接    异步IO 代码书写 非阻塞IO 再次理解IO 什么是IO&#xff1f;什么是高效的IO&#xff1f; 为了理解后面的一个问题&#xff0c;我们首先要再重新理解一下什么是IO 在之前的网络介绍中&#xff…

CUDA学习笔记(二)CUDA简介

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 CUDA是并行计算的平台和类C编程模型&#xff0c;我们能很容易的实现并行算法&#xff0c;就像写C代码一样。只要配备的NVIDIA GPU&#xff0c;就可以在许多设备上运行你的并行程序&#xf…

浅谈uniapp中开发安卓原生插件

其实官方文档介绍的比较清楚而且详细,但是有时候他太墨迹,你一下子找不到自己想要的,所以我总结了一下开发的提纲,也是为了自己方便下次使用。 1.第一步,下载官方提供的Android的示例工程,然后倒入UniPlugin-Hello-AS工程请在App离线SDK中查找,之后Android studio,编译运行项目…

自编efi文件测试vmware虚拟机如何进入UEFI环境

同事突然让帮忙编一下UEFI&#xff0c;之前完全没有接触过&#xff0c;在此粗鲁记录其过程。 UEFI的开源框架是edk2&#xff0c;开发环境配置起来还是有些麻烦&#xff0c;完全按照文档编译不过&#xff0c;经人帮助总算编译通过&#xff0c;但如何测试又是问题&#xff1b;网…

【T+】畅捷通T+增加会计科目提示执行超时已过期。

【问题描述】 在畅捷通T软件中&#xff0c; 增加会计科目的时候提示&#xff1a; 通过DataTable插入ext扩展表出错:执行超时已过期。 完成操作之前已超时或服务器未响应。 操作已被用户取消。 语句已终止。 【解决方法】 【方法一】 注销用户登录&#xff0c;回到软件登录界面…

FFmpeg和rtsp服务器搭建视频直播流服务

下面使用的是ubuntu的&#xff0c;window系统可以参考&#xff1a; 通过rtsp-simple-server和ffmpeg实现录屏并发布视频直播_rtsp simple server_病毒宇宇的博客-CSDN博客 一、安装rtsp-simple-server &#xff08;1&#xff09;下载rtsp-simple-server 下载地址&#xff1a;R…

vsCode 格式化配置

学习目标&#xff1a; 基于 vsCode 配置格式化工具&#xff0c;提高&#xff08;React、Vue &#xff09;开发效率  1. vsCode 安装 prettier 插件并启用  2. 修改配置文件 setting.json setting.json 位置&#xff1a; 依次点击 替换内容&#xff1a;↓ {"git.enab…

智加科技与东风柳汽达成深度合作 自动驾驶重卡计划2024年初量产交付

&#xff08;2023年10月19日&#xff0c;苏州&#xff09;全球领先的重卡自动驾驶技术公司智加科技与东风柳汽宣布&#xff0c;双方共同开发的自动驾驶重卡H7计划2024年初实现量产交付。未来&#xff0c;双方将携手推出安全可靠、高性价比、性能卓越的自动驾驶重卡产品&#xf…

STM32 HAL高级定时器正交编码模式案例

STM32 HAL高级定时器正交编码模式案例 &#x1f516;基于stm32F030RBT6单片机采用高级定时器1&#xff0c;编码器模式&#xff0c;测试EC11编码器。 &#x1f3ac;EC11测试效果&#xff1a; &#x1f33f;STM32定时器编码器有3种映射模式: ✨本次采用的是上面的模式3&#x…

postgresql14-模式的管理(三)

基本概念 postgresql成为数据库管理系统DBMS&#xff0c;在内存中以进程的形态运行起来成为一个实例&#xff0c;可管理多个database。 数据库databases&#xff1a;包含表、索引、视图、存储过程&#xff1b; 模式schema&#xff1a;多个对象组成一个模式&#xff0c;多个模…

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代&#xff0c;小程序已经成为企业营销的重要工具。通过小程序&#xff0c;企业可以提供更加便捷、高效的服务&#xff0c;吸引更多的用户和客户。本文将以小程序营销活动为主题&#xff0c;介绍如何在小程序文章中加入营销活动&#xff0c;提高品牌知名度和销售额。…

告别SQL优化和数据迁移备份烦恼,NineData--小白也能成为DBA的秘密武器!

1、概述 说起sql优化&#xff0c;大家可能首先想到的是创建索引、避免全表扫描、减少子查询及优化查询语句、避免隐式类型转换、慢查询日志记录慢SQL、explain分析SQL的执行计划及调优等等。当然&#xff0c;这也是我们常使用的一些调优手段&#xff0c;而且对开发人员也有一定…