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 = [自定义频率验证类]
就可以了

猜你喜欢

转载自blog.csdn.net/study_in/article/details/84927635