欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DRF的访问频率控制源码分析及应用

程序员文章站 2022-06-14 19:39:17
...

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

相关标签: DRF频率控制