内容回顾
-请求类的对象
-请求解析编码格式:局部,全局
-响应对象
-data,status,header
-响应格式:浏览器,json
-Serializer
-ModelSerializer(用的多,表模型有对应关系)
-两个视图基类
-APIView:执行流程
-GenericAPIView:两个类属性,三个方法
-5个视图扩展类(不是视图类)
-需要配合GenericAPIView使用
-9个视图子类
-视图集
-ModelViewSet
-ReadOnlyModelViewSet
-ViewSet
-GenericViewSet
-ViewSetMixin
-自动生成路由(SimpleRouter,DefaultRouter)
-action装饰器
-写一个类继承BaseAuthentication重写authenticate在里面判断用户是否登录,如果登录了返回两个值,第一个值必须是当前登录用户,如果认证失败,抛出异常
-局部使用
-全局使用
-写一个类继承BasePermission重写has_permission在里面判断用户是否有权限,如果有,return True,否则return False
-局部使用
-全局使用
今日内容
1 频率限制(****
)
-request.META.get('REMOTE_ADDR')
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'ip_m_3': '3/m',
}
}
-配置在视图类中
class IndexView(APIView):
throttle_classes = [MyThrotting, ]
-配置在settings.py中
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.auth.MyThrotting',],
}
class MyThrotting(SimpleRateThrottle):
scope = 'ip_m_3'
def get_cache_key(self, request, view):
return self.get_ident(request)
3 过滤排序(****
)
3.1 内置 过滤使用
from rest_framework.generics import ListAPIView
from .models import Book
from .serializer import BookSerializer
from rest_framework.viewsets import ViewSetMixin, GenericViewSet
from rest_framework.mixins import ListModelMixin
from rest_framework.filters import SearchFilter,OrderingFilter
class BookView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [SearchFilter,]
search_fields=['name',]
search_fields=['name','price']
3.2 内置排序使用
from rest_framework.filters import SearchFilter, OrderingFilter
class BookView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [OrderingFilter, ]
ordering_fields = ['price','id']
3.3 排序和过滤同时使用
from rest_framework.filters import SearchFilter, OrderingFilter
class BookView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [SearchFilter,OrderingFilter, ]
search_fields=['name',]
ordering_fields = ['price']
3.4 第三方过滤类的使用
4 分页(****
)
4.1 自定义分页类
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'