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

过滤

过滤就是根据路由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对象,因为要啥功能自己配就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weer-wmq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值