内置过滤
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' # 函数的路径
}