drf分页器、全局异常、Response对象封装、接口文档生成
一、三种分页器的使用
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)
- 新建一个类,继承普通分页,重写四个属性
- 视图类写法如下
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对象
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)
在视图类中返回:
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/