drf之分页异常处理自动接口文档
一 分页器(三种)重点如何使用
1 关于分页器
1.1 内置的三种分页器
1)-PageNumberPagination:普通分页
2)-LimitOffsetPagination:偏移分页
3)-CursorPagination:游标分页
1.2 两种分页模式
1) APIView
2) GenericAPIView+ListModelMixin
2 GenericAPIView+ListModelMixin的分页模式
2.1.1 属性
1)-page_size = api_settings.PAGE_SIZE # 每页显示多少条
2)-page_query_param = ‘page‘ # 查询参数
3)-page_size_query_param = size # 查询的时候指定每页显示多少条
4)-max_page_size = 10 # 每页最多显示多少条
2.1.2 使用方式
1)-定义一个类,继承PageNumberPagination
2)-重写四个属性
3)-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
4)-查询
http://127.0.0.1:8000/students/?page=1&size=5
2.1 属性
1)-default_limit = api_settings.PAGE_SIZE # 默认条数
2)-limit_query_param = ‘limit‘ # 查询时,指定查询多少条
3)-offset_query_param = ‘offset‘ # 查询时,指定的起始位置是哪
4)-max_limit = None # 查询时,最多返回多少条
2.2 使用方式
1)-定义一个类,继承LimitOffsetPagination
2)-重写四个属性
3)-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyLimitOffsetPagination
4)-查询
http://127.0.0.1:8000/students/?limit=100&offset=1
3.1 属性
1)-cursor_query_param = ‘cursor‘ # 查询的时候,指定的查询方式
2)-page_size = api_settings.PAGE_SIZE # 每页显示多少条
3)-ordering = ‘-created‘ # 排序方式
4)-page_size_query_param = size # 查询的时候指定每页显示多少条
5)-max_page_size = None # 每页最多显示多少条
3.2 使用方式
1)-定义一个类,继承CursorPagination
2)-重写五个属性
3)-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyCursorPagination
4)-查询
http://127.0.0.1:8000/students/?cursor=cD0xNQ%3D%3D
3 APIView的分页模式
3.1 使用方式
1)-新建一个类,继承普通分页,
2)-重写四个属性
3)-视图类写法如下
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) # 返回数据
二 全局异常
1 为何使用全局异常
# 统一接口的返回方式,即便视图函数执行出错。
2 使用方式
1)-写一个函数
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
2)-在setting中配置
REST_FRAMEWORK = {
‘EXCEPTION_HANDLER‘:‘app01.utils.common_exception_handler‘
}
三 封装Response对象
1 封装自己的Response对象
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) # 这里使用update
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 如何使用
1) 在路由中 from rest_framework.documentation import include_docs_urls path(‘docs/‘, include_docs_urls(title=‘图书管理系统api‘))2) 在配置文件中 REST_FRAMEWORK = { ‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.coreapi.AutoSchema‘, }3) 写视图类(需要加注释) class BookListCreateView(ListCreateAPIView): """ get: 返回所有图书信息. asdfasfda post: 新建图书. """ queryset = Student.objects.all() serializer_class = StudentSerializer4) 只需要在浏览器输入,就可以看到自动生成的接口文档() http://127.0.0.1:8000/docs/
drf之分页异常处理自动接口文档