DRF的访问频率控制源码分析及应用
一:restframework的访问频率控制源码分析
1、还是首先访问dispatch
2、进入initial中,self.check_throttles(request):实现频率控制,进去看源码
3、for throttle in self.get_throttles():又是一个循环遍历
4、进去self.get_throttles(),还是一个列表生成式,返回的是一个类的实例的列表
return [throttle() for throttle in self.throttle_classes]
5、看一下self.throttle_classes,
全局的配置文件中是:
throttle_classes=
api_settings.DEFAULT_THROTTLE_CLASSES
我们可以自定义进行配置,来实现我们自定义的频率控制
6、接下来回到第三步for循环内部的代码:
if not throttle.allow_request(request, self):
self.throttled(request, throttle.wait())
如果throttle.allow_request(request, self)返回False,那么就是进入到内部
def throttled(self, request, wait):
raise exceptions.Throttled(wait)
通过wait等待时间拼接一个字符串,抛出一个异常,提示我们的访问频率过高
如果throttle.allow_request(request, self)返回True,那么就继续循环遍历
二:、设置访问频率
1、全局设置访问频率:
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['自己编写的频率认证类的绝对路径']
}
某个不需要访问频率限制的类里面
throttle_classes = []
2、局部设置频率访问限制:
在需要限制频率的类里面写
throttle_classes = ['自定义的频率认证类']
三、其余的频率验证类
from rest_framework.throttling import BaseThrottle
remote_addr = request.META.get(‘REMOTE_ADDR’)获取用户IP
from rest_framework.throttling import BaseThrottle
BaseThrottle为所有频率认证类的基类
from rest_framework.throttling import SimpleRateThrottle
SimpleRateThrottle是下面三个类的父类
from rest_framework.throttling import AnonRateThrottle
匿名的用户频率认证
from rest_framework.throttling import UserRateThrottle
通过用户的pk进行频率认证
from rest_framework.throttling import ScopedRateThrottle
应用在局部视图上,一般不用
四:自定义访问频率限制类
在setting中添加:(全局进行限制)
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['自己编写的频率认证类的绝对路径']
"DEFAULT_THROTTLE_RATES":{
"自定义的scope":"自定义的访问频率"
#例如:20/m,代表每分钟允许访问20次,
#duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
#在源码中是这样定义的,period是斜杠后面的所有字母,所以时间无论你写单个字母还是全拼都是可以的,因为它只取第一个字母
}
}
自己编写频率验证只用四行就可以实现对ip的访问限制
class XXX频率验证类(SimpleRateThrottle):
scope = "自定义" #配置中当key用,用来拿值,在settings里面设置访问频率
def get_cache_key(self,request,view):
return self.get_ident(request)
#在源码中get_ident中能够获取用户的ip,自动实现对ip的限制访问频率
##该部分可以自定义设置,比如设置request.user.xxxx 实现对用户的xxxx限制访问频率,比如用户的手机号,身份证号等唯一性的条件。
需要特殊的访问频率的只需在自己定义一个频率验证类,然后在视图函数里面加上
throttle_classes = [自定义频率验证类]
就可以了
上一篇: 一个PHP实现的轻量级简单爬虫
下一篇: java 爬取网页内容。 标题、图片等