drf之分页异常处理自动接口文档

drf之分页异常处理自动接口文档

一 分页器(三种)重点如何使用

1 关于分页器

1.1 内置的三种分页器

1)-PageNumberPagination:普通分页
2)-LimitOffsetPagination:偏移分页
3)-CursorPagination:游标分页

1.2 两种分页模式

1) APIView
2) GenericAPIView+ListModelMixin

2 GenericAPIView+ListModelMixin的分页模式

2.1 PageNumberPagination:普通分页(用的最多)

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 LimitOffsetPagination:偏移分页

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 CursorPagination:游标分页(速度块)

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之分页异常处理自动接口文档

上一篇:javascript实现排序算法


下一篇:Redis 连接池(Jedis 和 lettece)