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

news2024/9/25 7:26:05

过滤

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

1、安装:pip3 install django-filter

2、注册:在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.py

	from rest_framework.filters import OrderingFilter
	class BookView(ListAPIView):
		queryset = models.Book.objects.all()
		serializer_class = BookSerializer
		filter_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_header
	    if getattr(exc, 'wait', None):
	        headers['Retry-After'] = '%d' % exc.wait
	
	    if isinstance(exc.detail, (list, dict)):
	        data = exc.detail
	    else:
	        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 status

def 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.coloradmin.cn/o/1131140.html

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

相关文章

MYSQL(事务+锁+MVCC+SQL执行流程)理解(2)

一)MYSQL中的锁(知识补充) 可以通过In_use字段来进行判断是否针对于表进行加了锁 1)对于undo log日志来说:新增类型的,在事务提交之后就可以清除掉了,修改类型的,事务提交之后不能立即清除掉这些日志会用于mvcc只有当没有事务用到该版本信息时…

列表推导式、集合推导式、字典推导式、生成器

列表推导式 可以与三目运算符搭配使用 dict1 {name: "by", "age": 20} dict2 {name: "ss", "age": 25} dict3 {name: "sa", "age": 24} dict4 {name: "xs", "age": 27} list1 [dict1, …

Python 算法高级篇:分治算法的原理与应用

Python 算法高级篇:分治算法的原理与应用 1. 什么是分治算法?2. 分治算法的应用2.1 归并排序2.2 快速排序2.3 最大子数组问题2.4 汉诺塔问题 3. 代码示例3.1 分治算法求幂 4. 总结 分治算法是一种重要的算法设计技巧,它将一个大问题分解为多个…

(R900567512)4WE6D6X/OFEG24N9K4液压电磁换向阀

(R900567512)4WE6D6X/OFEG24N9K4液压电磁换向阀特点: ▶▶ 具有三位四通,二位四通或二位三通的方向设计 ▶▶ 高功率线圈 ▶▶ 油口安装面符合 DIN 24340 形式 A ▶▶ 油口安装面符合 ISO 4401-03-02-0-05和 NFPA T3.5.1 R2-2002 D03 ▶▶ 带…

虹科 | 解决方案 | 汽车示波器 索赔管理方案

索赔管理 Pico汽车示波器应用于主机厂/供应商与服务店/4S店的协作,实现产品索赔工作的高效管理;同时收集的故障波形数据,便于日后的产品优化和改进 故障记录 在索赔申请过程中,Pico汽车示波器的数据记录功能可以用于捕捉故障时的…

搭建zlmediakit和wvp_pro

zlmediakit使用zlmediakit/zlmediakit:master镜像 wvp_pro使用648540858/wvp_pro,可参照https://github.com/648540858/wvp-GB28181-pro wvp_pro官方https://doc.wvp-pro.cn/#/ 刚开始我找了个docker镜像运行,后来播放页面一直加载,最后就用了…

软件设计包括了四个既独立又相互联系的活动

软件设计包括了四个既独立又相互联系的活动

广告联盟是什么?app开发者如何选择广告联盟?

在广告变现过程中,广告联盟是必不可少的因素,广告联盟是一种在线广告服务模式,它将广告主和网站主(或博主、应用开发者等)联系在一起,通过广告联盟平台的中介服务,将广告主的广告投放到网站主的…

sigmoid和softmax函数的区别;神经网路常用的损失函数以及对应的应用场景;softmax的作用

一、Sigmoid函数和Softmax函数是常用的激活函数,它们在神经网络中经常用于实现非线性映射。 Sigmoid函数:Sigmoid函数常用于二分类问题,它将输入的取值范围映射到一个介于0和1之间的输出。Sigmoid函数的公式是 f(x) 1 / (1 exp(-x))&#x…

Python的web自动化学习(一)Selenium库的工作原理

Python的web自动化学习(一)Selenium库的工作原理 首发2023-07-31 11:01云中随心而记 后续会根据持续学习来更新,大家一起学习 引言: Selenium是一个流行的自动化测试工具,用于模拟和控制浏览器行为,常用于…

美创科技列为IDC中国数据安全市场代表厂商

近日,国际权威IT咨询机构IDC发布《中国数据安全市场发展趋势,2023》报告,报告针对中国数据安全市场的发展现状进行调研,明确了最终用户数据安全建设的痛点、难点,阐述了市场中各技术服务提供商的服务方案和优势。 美创…

24 个常见的 Docker 疑难杂症处理技巧!!!记得点赞收藏

1. Docker 迁移存储目录 默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下 [问题起因] 今天通过监控系统,发现公司其中一台服务器的磁盘快满了,随即上去看了下,发现 /var/lib/docker 这个目录特别大。由上述原因,我们都…

【openGauss】一主一备实现主备节点切换实验(switchover、failover)

openGauss在运行过程中,数据库管理员可能需要手工对数据库节点做主备切换。例如发现数据库节点主备failover后需要恢复原有的主备角色,或怀疑硬件故障需要手动进行主备切换。 级联备机不能直接转换为主机,只能先通过switchover或者failover成…

抖音上的影视解说是怎么配音的?

抖音影视解说的配音是从各种渠道配的。其中,最常见的方法是使用 AI 配音。AI 配音可以通过在线配音平台或语音合成软件实现。这些软件可以生成各种声音,包括电影解说、主播、卡通、游戏等。此外,一些抖音影视解说也使用了真人配音。真人配音通…

代码训练营第49天:leetcode139单词划分|多重背包|背包讲解

leetcode139&#xff1a;单词划分 文章讲解&#xff1a;leetcode139 多重背包&#xff1a;文章讲解 背包讲解&#xff1a;文章讲解 1&#xff0c;leetcode139 单词划分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set…

Redis 主从

目录 ​编辑一、构建主从架构 1、集群结构 2、准备实例和配置 &#xff08;1&#xff09;创建目录 &#xff08;2&#xff09;修改原始配置 &#xff08;3&#xff09;拷贝配置文件到每个实例目录 &#xff08;4&#xff09;修改每个实例的端口&#xff0c;工作目录 &a…

SpringBoot-集成Minio

官方文档&#xff1a;Kubernetes 的 MinIO 对象存储 — MinIO Object Storage for Kubernetes 一、简介 Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频…

Spring Boot和XXL-Job:高效定时任务管理

Spring Boot和XXL-Job&#xff1a;高效定时任务管理 前言第一&#xff1a;XXL-Job简介什么是XXL-job对比别的任务调度 第二&#xff1a; springboot整合XXL-job配置XXL-Job Admin拉取XXL-Job代码修改拉取的配置 配置执行器自己的项目如何整合maven依赖properties文件配置执行器…

工厂干洗店洗鞋店系统,校园洗护小程序来了

洗鞋店小程序&#xff0c;干洗店软件&#xff0c;洗护行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发&#xff0c;成品软件开发 洗衣工厂软件、功能强大&#xff01; 包含以下主要功能&#xff1a; * 用户选择洗护用品&#x…