24. drf分页器、全局异常、封装、接口文档

一、三种分页器的使用

1、内置的三种分页器
	- PageNumberPagination:普通分页(最常用)
    - LimitOffsetPagination:偏移分页
    - CursorPagination:游标分页

2、APIView和GenericAPIView+ListModelMixin

3、GenericAPIView+ListModelMixin的分页模式

1、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
    - 查询url示例:
		http://127.0.0.1:8000/students/?page=1&size=5

2、LimitOffsetPagination:偏移分页

# 配置的属性
    - default_limit = api_settings.PAGE_SIZE  # 默认条数
    - limit_query_param = 'limit'			  # 查询时指定查询条数
    - offset_query_param = 'offset'			  # 查询时,指定的起始位置
    - max_limit = None						  # 查询时,最多返回的条数

# 使用方式:
    - 定义一个类,继承LimitOffsetPagination
    - 重写四个属性
    - 在继承了GenericAPIView+ListModelMixin视图类中配置
        pagination_class = MyPageNumberPagination
    - 查询url示例:
        http://127.0.0.1:8000/students/?limit=100&offset=1

3、CursorPagination:游标分页(优点速度快)

# 配置的属性:
    -cursor_query_param = 'cursor'  	 # 查询的时候,指定的查询方式
    -page_size = api_settings.PAGE_SIZE  # 每页显示的条数
    -ordering = '-created'				 # 排序方式
    -page_size_query_param = size 		 # 查询的时候指定的每页显示的条数
    -max_page_size = None				 # 每页显示的条数
# 使用方式:
	- 新建一个类,继承普通分页,重写四个属性
    - 视图类写法如下
    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)  # 返回数据    
  • 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) # 返回数据

二、全局异常

1、统一接口的返回方式,(即使视图函数执行出错)
2、使用方式:
	- 写一个函数
    from rest_framework import status
	from rest_framework.views import exception_handler
    
    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
    
    -settings中配置:
    	REST_FRAMEWORK = {
            'EXCEPTION_HANDLER': 'app01.utils.commom_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)
        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://www.127.0.0.1:8000/students/?page=2&size=10')
    

四、自动生成接口文档

1、借助于第三方:coreapi,swagger

2、在路由中
	from rest_framework.documentation import include_docs_urls
    urlpatterns=[
        path('docs/', include_docs_urls(title='图书管理系统api')),
    ]
    
3、在配置文件中
    REST_FRAMEWORK = {
        'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
    }

4、写视图类(需要加注释)
	class BookListCreateView(ListcreateView):
        '''
        get:
        返回所有的图书信息
        ...
        
        post:
        新建一条图书信息
        ...
        '''
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
        
5、只需要在浏览器中输入,就可以看到自动生成的接口文档
	- http://127.0.0.1:8000/docs/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值