首页 > 其他 > 详细

drf 之自定制过滤器 分页器(三种)如何使用(重点) 全局异常 封装Response对象 自动生成接口文档

时间:2020-11-13 00:34:45      阅读:45      评论:0      收藏:0      [点我收藏+]

自定制过滤器  分页器(三种)如何使用(重点)  全局异常 封装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‘
}




四 封装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://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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!