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