23. drf频率的配置

一、自定义频率类(了解)

1、作用:限制某个user、或某个ip(匿名用户)的访问频次

2、自定义频率类及使用
# 分析:根据ip进行频率限制,如每分钟只能访问3次
# 实现限制的逻辑:
	- 步骤(1):取出访问者的ip
    - 步骤(2):判断:- 若前用户ip不在访问字典里-->添加进去,并且返回True,表示第一次访问;
    			   - 若ip在访问字典里面--->继续往下走
    - 步骤(3):循环判断当前ip的列表,如果里面有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间
    - 步骤(4):判断:- 当列表长度小于3,说明一分钟以内访问不足三次,把时间插入到列表中第一个位置,返回True,顺利通过
   			   - 当了,列表中长度大于等于3,说明一分钟以内访问超过三次,返回False验证失败

3、代码实现:
from rest_framework.throttling import BaseThrottle
class MyThrottle(BaseThrottle):
    VISIT_RECORD = {}  # 存用户访问信息的大字典
    
    def __init__(self):
        self.history = None
        
    def allow_request(self,request,view):
        
        # 步骤(1)
        ip = request.META.get('REMOTE_ADDR')
        import time
        ctime = time.time()
        
        # 步骤(2)
        if ip not in self.VISIT_RECORD:
            self.VISIT_RECORD[ip] = [ctime, ]
            return True
        self.history = self.VISIT_RECORD.get(ip)
        
        # 步骤(3)
        while self.history and ctime - self.history[-1] > 60:
            self.history.pop()
        # 步骤(4)
        if len(self.history) < 3:
            self.history.insert(0, ctime)
            return True
        else:
            return False
        
    def wait(self):
        # 设置显示还有多少时间才能访问
        import time
        ctime = time.time()
        return self.history[-1] + 60 - ctime
        
4、使用:
	- 局部使用
    - 全局使用

二、内置频率类使用

1、使用
	- 局部使用:
    	throttle_classes = [auth.MyThrottle, ]
    - 全局使用:
    	REST_FRAMEWORK = {
            "DEFAULT_THROTTLE_CLASSES":["app01.auth.MyThrottle", ]
        }
     
2、内置频率类
	BaseThrottle: 基类
    AnonRateThrottle:限制匿名用户的访问频率
    SimpleRateThrottle:可以自定义扩写
    ScopedRateThrottle:
    UserRateThrottle: 限制登录用户访问频率
   
3、扩展内置频率类(重点)
	# 写一个类,继承SimpleRateThrottle
    class MySimpleThrottle(SimpleRateThrottle):
        scope = 'xxx'
        def get_cache_key(self, request, view):
            # 通过ip限制
            return self.get_ident(request)
     
    # settings.py中配置:
    	REST_FRAMEWORK = {
            "DEFAULT_THROTTLE_RATES":{
                'xxx':'3/m',  # key和scope对应,value是 "单位时间允许访问的次数/时间单位"
            }
        }
    
    # 局部使用和全局使用
   
4、源码分析
	- 继承SimpleRateThrottle ---> allow_request(与上面自定义频率类中的allow_request逻辑一样)
   
5、其他内置频率类
	- 限制未登录用户的频率(AnonRateThrottle),根据ip限制
   		- 使用:
        	 - 局部使用、全局使用
             - settings.py中配置
                'DEFAULT_THROTTLE_RATES':{
                    'anon':'1/m'
                }
                  
    - 限制登录用户访问次数UserRateThrottle(根据用户id限制)
    	- 使用:
        	- 局部使用、全局使用
            - setting.py中配置
            	'DEFAULT_THROTTLE_RATES':{
                    'user':'3/m'
                }
                 
    - ScopedRateThrottle            

三、内置,第三方过滤功能

1、过滤:筛选查询结果
2、内置筛选的使用
from rest_framework.filters import BaseFilterBackend, SearchFilter, OrderingFilter
	- 在视图类中配置
    	filter_backends = [SearchFilter, ]
        search_fields = ('name', )  # 表模型中的字段
    - 查询的url:
    	http://127.0.0.1:8000/users/?search=cc
       	# 注意点:内置的筛选器配置url时查询key必须是search,value的查找是模糊匹配
      
3、第三方扩展的过滤功能
	- pip3 install django-filter 
    	# 最新版本2.4.0 要配合Django2.2以上版本使用(更改高版本的django后可能需要更改源码中的一处decode--->encode)
      
    - 在视图类中配置
    	filter_backends = [DjangoFilterBackend, ]
        filter_fileds = ['name', 'age']
     
    - 查询的url:
    	http://127.0.0.1:8000/users/?name=cc&age=18

四、排序功能

 - 在视图类中配置
    filter_backends = [OrderingFilter, ]
    ordering_fields = ['id', 'age']
 
- 查询url:
	http://127.0.0.1:8000/users/?ordering=-age
         
# 过滤后再排序:
- 在视图类中配置
    filter_backends = [OrderingFilter, DjangoFilterBackend]
    ordering_fields = ('id', 'age')
    filter_fields = ['name', 'age']
    
- 查询的url:
	http://127.0.0.1:8000/users/?name=cc&age=20&ordering=-age.-id

扩展:

获取请求来源的ip地址
remote_addr = request.META.get('REMOTE_ADDR') 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值