2021-09-06day69频率限制 过滤限制 内置过滤使用 内置排序的使用 排序和过滤的同时使用 第三方过滤类的使用 分页的使用

6 篇文章 0 订阅

内容回顾

# drf:方便我们在django框架上写出符合restful规范的接口
# 请求和响应
	-请求类的对象
    -请求解析编码格式:局部,全局
    
    -响应对象
    	-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 频率限制(****

# 限制用户的访问次数:根据用户ip地址限制
# 访问者IP地址
	-request.META.get('REMOTE_ADDR')
    
 

#####频率类的使用
# 1 写一个类,继承SimpleRateThrottle,重写get_cache_key,返回ip就以ip限制
# 2 在类中写一个类属性:scope = 'ip_m_3'
# 3 在settings.py中写
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        # key值是频率类中scop字段对应的值,value是访问次数限制
        '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)  #返回访问者的ip:BaseThrottle的访问

3 过滤排序(****

# 请求地址中带过滤条件
# 在视图函数中配置 filter_backends  内置,第三方,自己写
# 继承哪个视图类,才能使用filter_backends,必须继承GenericAPIView及其子类

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',]  # http://127.0.0.1:8000/books/?search=红 只要是name中带红都会查出来
    search_fields=['name','price'] # http://127.0.0.1:8000/books/?search=红 只要是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'] # http://127.0.0.1:8000/books/?ordering=-price 按price降序排列
    ordering_fields = ['price','id'] #http://127.0.0.1:8000/books/?ordering=-price,-id 按price降序排列,如果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']  #http://127.0.0.1:8000/books/?search=记&ordering=-price  查询名字中带记的并且按价格降序排列

3.4 第三方过滤类的使用

# http://127.0.0.1:8000/books/?name=红楼梦&price=12
# django-filter--基本使用(更高级,后面项目讲)
# pip install django-filter

4 分页(****

4.1 自定义分页类

############## 自定义分页类
##基本分页
from rest_framework.pagination import  PageNumberPagination,LimitOffsetPagination,CursorPagination
##基本分页
class MyPageNumberPagination(PageNumberPagination):
    # 重写4个类属性即可
    page_size = 2  # 每页显示两条
    page_query_param = 'page'  # 查询条件  http://127.0.0.1:8000/books/?page=2
    page_size_query_param = 'size'  # http://127.0.0.1:8000/books/?page=2&size=4 获取第二页数据,返回4条
    max_page_size = 5               # http://127.0.0.1:8000/books/?page=2&size=400 获取第二页数据,最多返回5条


class MyLimitOffsetPagination(LimitOffsetPagination):
    # 4个类属性
    default_limit = 2   #每页默认显示多少条
    limit_query_param = 'limit' # http://127.0.0.1:8000/books/?limit=3
    offset_query_param = 'offset'# http://127.0.0.1:8000/books/?limit=3&offset=1  # 从2位置取3条数据
    max_limit = 5   # 限制limit最大条数


class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询条件,无用
    page_size = 2  # 每页显示多少条
    ordering = 'id' #按谁排序
############## 自定义分页类
##基本分页
from rest_framework.pagination import  PageNumberPagination,LimitOffsetPagination,CursorPagination
##基本分页
class MyPageNumberPagination(PageNumberPagination):
    # 重写4个类属性即可
    page_size = 2  # 每页显示两条
    page_query_param = 'page'  # 查询条件  http://127.0.0.1:8000/books/?page=2
    page_size_query_param = 'size'  # http://127.0.0.1:8000/books/?page=2&size=4 获取第二页数据,返回4条
    max_page_size = 5               # http://127.0.0.1:8000/books/?page=2&size=400 获取第二页数据,最多返回5条


class MyLimitOffsetPagination(LimitOffsetPagination):
    # 4个类属性
    default_limit = 2   #每页默认显示多少条
    limit_query_param = 'limit' # http://127.0.0.1:8000/books/?limit=3
    offset_query_param = 'offset'# http://127.0.0.1:8000/books/?limit=3&offset=1  # 从2位置取3条数据
    max_limit = 5   # 限制limit最大条数


class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询条件,无用
    page_size = 2  # 每页显示多少条
    ordering = 'id' #按谁排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值