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')

猜你喜欢

转载自www.cnblogs.com/suncunxu/p/10626846.html