自定制过滤器 分页器(三种)如何使用(重点) 全局异常 封装Response对象 自动生成接口文档
一、自定制过滤器
基于django-filter扩写 1 写一个类MyFilter,继承BaseFilterVackend 2 重写filter_queryset方法,在该方法内部进行过滤 3 返回queryset对象(过滤后的queryset对象) 4 配置在视图类中 filter_backends = [MyFilter,]
二、分页器(三种)重点如何使用
1 内置了三种分页器 PafeNumberPagination:普通分页 LimitOffsetPagination:偏移分页 CursorPagination:游标分页 2 APIView和GenericAPIView+ListModelMixin 3 GenericAPIView+ListModelMixin的分页模式 4 PageNumberPagination:普通分页模式(用的最多) page_size = api_settings.PAGE_SIZE # 每页显示多少条 page_query_param = ‘page‘ #查询参数 page_size_query_param = size #查询的时候指定每页显示多少条 max_page_size = 10 每页最多显示多少条 使用方式: 定义一个类,继承PageNumberPagination 重写四个属性 在继承 了GenericAPIView+ListModelMixin视图类中配置 pagination_class = MyPageNumberPagination 查询 http://127.0.0.1:8000/students/?page=1&size=5 5 LimitOffsetPagination: 偏移分页 default_limit = api_settings.PAGE_SIZE 默认条数 limit_query_param = ‘limit‘ 查询时,指定查询多少条 offset_query_param = ‘offset‘ 查询时,指定的起始位置是那 max_limit = None 查询时,最多返回多少条 使用方式:
定义一个类,继承LimitOffsetPagination
重写了四个属性
在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = myPageNumberPagination
查询
http://127.0.0.1:8000/student/?limit=100&offset=1
6 CursorPagination:游标分页(速度快)
cursor_query_param = ‘cursor‘ 查询的时候,指定的查询方式
page_size = api_settings.PAGE_SIZE 每页默认显示多少条
ordering = ‘-created‘ 排序方式
page_size_query_param = size 查询的时候指定每页显示多少条
max_page_size = None 每页最多显示多少条
使用方式:
定义一个类:
定义一个类,继承LimitOffsetPagination
重写四个属性
在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
查询
http://127.0.0.1:8000/students/
7 APIView的分页模式
新建一个类,继承普通分页,重写了四个属性
视图类写法如下
class StudentApiView(APIView):
def get(self,request):
student_list = Student.objects.all()
page=MyPageNumberPagination() 实例化得到对象
只需要换不同的分页类即可
res = page.paginate_queryset(student_list,request,self) #开始分页
ser = StudentSerializer(res,many=True)
return page.get_paginated_response(ser.data) 返回数据
def common_exception_handel(exc,context): response = exception_handler(exc,context) # exc 报错的对象 if response is None: #错误信息记录日志 print(context,1111) #{‘view‘: <app01.views.BookApiView object at 0x00000176FE5A2760>, # ‘args‘: (), ‘kwargs‘: {}, ‘request‘: <rest_framework.request.Request: GET ‘/bookes/?page=4&s=2‘>} 1111 print(context[‘view‘]) #那个视图函数出错 view = context[‘view‘] #<app01.views.BookApiView object at 0x00000176FE5A2760>那个视图函数 request = context[‘request‘] #<rest_framework.request.Request: GET ‘/bookes/?page=4&s=2‘> 当次请求的request对象 print(context[‘request‘]) print(str(view)) print(request.path) #/bookes/请求的路径 print(request.method) #请求方式GET print(request.META.get(‘REMOTE_ADDR‘)) #127.0.0.1 ip地址 #记录日志(django日志) #sentry #print(‘执行函数出错,用户请求的地址是:%s,用户的ip是%s‘% # (request.path,request[‘META‘][‘REMOTE_ADDR‘])) return Response({‘code‘:99,‘detail‘:str(exc)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) return response sentry日志追踪异常 django写的 异步操作 可以使用于很多平台不管是用什么语言写的其本质是记录错误信息后, 调用一个sentry借口,通过网络将异常信息发送到sentry上即可。
简写
1 统一接口的返回方式,即便视图函数执行出错
2 使用方式
-写一个函数
def common_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is None:
response = Response({‘code‘:999,‘detail‘: ‘未知错误‘}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
-在setting中配置
REST_FRAMEWORK = {
‘EXCEPTION_HANDLER‘:‘app01.utils.common_exception_handler‘
}
class APIResponse(Response): def __init__(self,code=100,msg=‘成功‘, data=None, status=None, headers=None, content_type=None, **kwargs): dic = {‘code‘:code,‘msg‘:msg} if data: dic[‘data‘] = data dic.update(kwargs) super().__init__(data=dic,status=status, template_name=None,headers=headers, exception=False,content_type=content_type)
2 使用:
return APIResponse(code=100,msg=‘查询成功‘,data=ser.data,count=200,next=‘http://wwwa.asdfas‘)
1 借助于第三方:coreapi,swagger 2 在路由中 from rest_framework.documentation import include_docs_urls path(‘docs/‘, include_docs_urls(title=‘图书管理系统api‘)) 3 在配置文件中 REST_FRAMEWORK = { ‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.coreapi.AutoSchema‘, } 4 写视图类(需要加注释) class BookListCreateView(ListCreateAPIView): """ get: 返回所有图书信息. asdfasfda post: 新建图书. """ queryset = Student.objects.all() serializer_class = StudentSerializer 5 只需要在浏览器输入,就可以看到自动生成的接口文档() http://127.0.0.1:8000/docs/
drf 之自定制过滤器 分页器(三种)如何使用(重点) 全局异常 封装Response对象 自动生成接口文档
原文:https://www.cnblogs.com/ltyc/p/13966462.html