内置过滤 
from rest_framework.filters import SearchFilter,OrderingFilter

在DRF规范里请求地址中要带过滤条件,查询所有才需要过滤和排序。
1、在视图类中配置内置过滤类。filter_backends = [SearchFilter]    最顶层的类至少是GenricAPIView, 因为filter_backends是GenricAPIView里的.
2、视图类中配置以什么字段搜索过滤。search_fields = ['title','addr']
3、postman搜索:http://127.0.0.1:8080/book/?search=七龙    (只要title和addr里有七龙的都会过滤出来,模糊匹配) 
     问好后面必须是search,它在rest_framework的配置文件里配置好了。 要改的话在自己项目的配置文件修改search就行了。'SEARCH_PARAM': 'search',  


排序
1、在视图类中配置内置,可以和过滤一起用。filter_backends = [SearchFilter,OrderingFilter] 
2、视图类中配置以什么字段排序。ordering_fields = ['price']
3、postman搜索:http://127.0.0.1:8000/api/book/?search=大&ordering=-price  过滤出来后以价格排序,加横杠是降序。
3、postman搜索:http://127.0.0.1:8000/api/book/?search=大&ordering=price,id  价格都一样后再按照id排序。





第三方过滤:pip install django-filter  查看支持python版本去官网,如果不兼容老版本它会卸载老的,按照新的。
from django_filters.rest_framework import DjangoFilterBackend
1、在视图类中配置:filter_backends = [DjangoFilterBackend] 
2、在视图类中配置:filter_fields = ['tile','addr']      # 以哪些字段过滤。
3、postman搜索:http://127.0.0.1:8080/book/?title=七龙&addr=河北  # 这个就是精确匹配了,把标题是"七龙",地址是"河北"的找出来。


全局异常的异常处理。

django内置异常
  Http404
  PermissionDenied

内置的 exception_handler 方法处理了如下异常并只处理了DRF的异常,没处理Django的异常。如视图类的异常...
以下是DRF的异常,且都继承了父类APIException
  NotFound 未找到
  PermissionDenied 权限拒绝
  ParseError 解析错误
  AuthenticationFailed 认证失败
  NotAuthenticated 尚未认证
  MethodNotAllowed 请求方式不支持
  Throttled 超过限流次数
  ValidationError 校验失败
  NotAcceptable 要获取的数据格式不支持
如果发生了上面的这些异常,DRF框架的excaption_handler函数可以自动捕获异常,然后进行处理,返回Response对象。如果不是上面的这些异常,则处理不了,返回None。

在生产环境中,需要把全部异常捕获,输入到日志中。而且也不希望把错误页面给用户看到,这时候可以针对 DRF 框架没有处理的异常,进行全局的异常处理。
1、建个py文件写一个函数, 函数在类里才叫方法。

from rest_framework.views import exception_handler # 导入异常处理方法
from rest_framework.response import Response

def custom_exception_handler(exc,context):  # # exc是APIView类里的dispatch方法里的 except Exception as exc:
    # 记录日志
    print('===',context)  # context是当次请求的对象,是个字典。请求头的数据都在request.META里
    print('--->>>',context['request'].META.get('REMOTE_ADDR'))

    response = exception_handler(exc,context)
    if response: # 处理了DRF的异常并返回
        data = {'code':999,'msg':'错误','detail':response.data}
        return Response(data)
    else:
        data = {'code':999,'msg':'未知错误'}
        return Response(data)   # django视图类的异常。

 

2、在配置文件中声明。

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'ren_zheng.auth.custom_exception_handler' # 函数的路径
}

 

 

 

posted on 2021-07-15 22:52  孟玉  阅读(70)  评论(0编辑  收藏  举报