• drf分页器,url控制器,解析器,响应器


    认证:

      类继承BaseAuthentication,重写authenticate方法:

      认证通过返回两个参数(当前用户,token),从request.user(request._user),request.auth(request.auth)获取

      认证失败抛出异常(Authenticaefailed(继承exception))

      局部使用:在类名下设置(authenticate_classes=[Myauthenticaeio,])

      全局使用:配置文件中设置,局部禁用,在类名下设置参数为空列表

    权限:

      类继承BasePermission,重写has_permission方法;

      认证通过返回rtue

      认证失败返回False

      局部禁用:同上

      全局使用:同上

    频率:

      类继承SimpleRateThrottle

      类中设置参数:scope="sb"

      重写get_cache_key方法

      def get_cache_key(self,request,view):

        return request.META.get('REMOT_ADDR')(ip地址)(返回的值为有辨识度的参数用于区分)

      在settings中配置

      'DEFAULT_THROTTLE_RATES':{'sb':'10/minute'}

      局部使用:同上:

      全局使用:同上

    分页器

    1.简单分页(查看第n页,每页显示m条)

    使用方法:导入PageNumberPagination类

    实例化产生对象,

    page_pagination = PageNumberPagination()

    需要配置四个参数

    page_size,page_query_param,page_size_query_param,max_page_size

    page_size必须指定:在settings中指定或直接赋值

    调用方法,返回数据

    sb = page_pagination.paginate_queryset(book_list,request,self)

    序列化,返回的数据

    类中需要掌握的属性:

    page_size:控制每页显示条数

    page_query_param:控制查询第几页的查询参数,比如page_query_param='sb'

    http://127.0.0.1:8000/boooks/?sb=2表示查询第二页数据

    page_size_query_param:控制每页最大显示的条数

    比如page_pagination.page_size_query_param='max'

    http://127.0.0.1:8000/books/?sb=2&max=8

    表示查询第二页的数据,每页显示八条(且第一页同时也是八条)

    max_page_size:控制每页最大显示的条数

    比如:page_pagination.max_page_size=7

    http://127.0.0.1:8000/books/?max=1000最多显示7条

    优先级分别为page_size_query_param>page_size  (当page_size_query_param大于max_page_size时,后方为准)

     1 from rest_framework.pagination import PageNumberPagination
     2 # 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
     3 class  Pager(APIView):
     4     def get(self,request,*args,**kwargs):
     5         # 获取所有数据
     6         ret=models.Book.objects.all()
     7         # 创建分页对象
     8         page=PageNumberPagination()
     9         # 在数据库中获取分页的数据
    10         page_list=page.paginate_queryset(ret,request,view=self)
    11         # 对分页进行序列化
    12         ser=BookSerializer1(instance=page_list,many=True)
    13         return Response(ser.data)
    14 # 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3
    15 # size=30,无效,最多5条
    16 class Mypage(PageNumberPagination):
    17     page_size = 2
    18     page_query_param = 'page'
    19     # 定制传参
    20     page_size_query_param = 'size'
    21     # 最大一页的数据
    22     max_page_size = 5
    23 class  Pager(APIView):
    24     def get(self,request,*args,**kwargs):
    25         # 获取所有数据
    26         ret=models.Book.objects.all()
    27         # 创建分页对象
    28         page=Mypage()
    29         # 在数据库中获取分页的数据
    30         page_list=page.paginate_queryset(ret,request,view=self)
    31         # 对分页进行序列化
    32         ser=BookSerializer1(instance=page_list,many=True)
    33         # return Response(ser.data)
    34         # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)
    35         return page.get_paginated_response(ser.data)
    36 
    37 复制代码
    38 setting里
    39 
    40 REST_FRAMEWORK = {
    41     # 每页显示两条
    42     'PAGE_SIZE':2
    43 }
    44  路由:
    45 
    46 url(r'^pager/$', views.Pager.as_view()),
    47  Serializers
    48 
    49 class BookSerializer1(serializers.ModelSerializer):
    50     class Meta:
    51         model=models.Book
    52         # fields="__all__"
    53         exclude=('authors',)
    简单分页实例

    2.偏移分页(在第n个位置,向后查看n条数据)

    使用方式:同简单分页

    重要参数:

    default_limit:默认每条显示的条数,默认偏移的数量

    http://127.0.0.1:8000/books/就会显示5条数据

    limit_query_param:向后偏移多少条

    就用默认值:limit

    offset_query_param:标杆值

    limit_query_param+offset_query_param联合使用:

    http://127.0.0.1:8000/books/?limit=1&offset=5

    表示以数据第五条为基准,往后查询一条数据

    max_limit:最大偏移的条数(最大取出的条数)

     1 复制代码
     2 # http://127.0.0.1:8000/pager/?offset=4&limit=3
     3 from rest_framework.pagination import LimitOffsetPagination
     4 # 也可以自定制,同简单分页
     5 class  Pager(APIView):
     6     def get(self,request,*args,**kwargs):
     7         # 获取所有数据
     8         ret=models.Book.objects.all()
     9         # 创建分页对象
    10         page=LimitOffsetPagination()
    11         # 在数据库中获取分页的数据
    12         page_list=page.paginate_queryset(ret,request,view=self)
    13         # 对分页进行序列化
    14         ser=BookSerializer1(instance=page_list,many=True)
    15         # return page.get_paginated_response(ser.data)
    16         return Response(ser.data)
    偏移分页

    3.CursorPagination(加密分页,只能查看上一页和下一页),速度快

    重要参数:

    page_size:每页显示的条数

    cursor_query_param:不需要动

    ordering:按什么排序

    通过get_paginated_response返回结果中上一页和下一页的链接地址

    page_pagination.get_paginated_response(book_ser.data)

    方法的用法

    响应器:(不需要改)

    响应返回的页面,数据的格式是不同的

    局部使用:

    在视图类中配置:

    renderer_classes=[JSONRenderer,BrowerableAPIRenderer]

    全局使用:在settings中配置:

    'DEFAULT_RENDERER_CLASSES':('rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',),

     1 from rest_framework.pagination import CursorPagination
     2 # 看源码,是通过sql查询,大于id和小于id
     3 class  Pager(APIView):
     4     def get(self,request,*args,**kwargs):
     5         # 获取所有数据
     6         ret=models.Book.objects.all()
     7         # 创建分页对象
     8         page=CursorPagination()
     9         page.ordering='nid'
    10         # 在数据库中获取分页的数据
    11         page_list=page.paginate_queryset(ret,request,view=self)
    12         # 对分页进行序列化
    13         ser=BookSerializer1(instance=page_list,many=True)
    14         # 可以避免页码被猜到
    15         return page.get_paginated_response(ser.data)
    加密分页

    url控制器

    自动生成路由:

    在url.py中:

    from rest_framework  import routers

    生成一个router对象

    router = routers.DefaultRouter()

    两个参数,一个是匹配的路由,一个是视图类中写的CBV的类

    router.register('books',views.BooksView)

    urlpatterns=[url(r'',include(router.urls))]

    解析器:

    作用:能够解析前传递的数据格式:urlencode,formdata,json格式

    默认情况下,解析所有格式,内置了三种解析器

    from rest_framework,parsers import JSONParser

    from rest_framework.parsers import FormParser

    from rest_framework,parsers import MultiPartParser

    解析器的局部使用

    在视图类中配置:

    parser_classes=[JSONParser]

    全局使用:

    在settings中

    'DEFAULT_PARSER_CLASSES':('rest_framework.parsers.JSONParser',

    'rest_framework.parsersFormParser',

    'rest_framework.parsers.MultiPartParser')

  • 相关阅读:
    django路由层(一)
    计算机基础2
    Django模板语言
    Django框架介绍
    Python--格式化输出,运算符
    Python---基础
    Tensorflow--TensorflowBoard
    Tensorflow--图和会话
    Tensorflow--Tensor
    Tensorflow--基础结构
  • 原文地址:https://www.cnblogs.com/suncunxu/p/10626846.html
Copyright © 2020-2023  润新知