认证:
类继承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')