drf : 频率源码分析
频率组件
一、自定义频率组件
自定义的逻辑
#(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走 # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过 # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
源码实现:
class MyThrottles(): VISIT_RECORD = {} def __init__(self): self.history=None def allow_request(self,request, view): #(1)取出访问者ip # print(request.META) ip=request.META.get('REMOTE_ADDR') import time ctime=time.time() # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问 if ip not in self.VISIT_RECORD: self.VISIT_RECORD[ip]=[ctime,] return True self.history=self.VISIT_RECORD.get(ip) # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, while self.history and ctime-self.history[-1]>60: self.history.pop() # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过 # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败 if len(self.history)<3: self.history.insert(0,ctime) return True else: return False def wait(self): import time ctime=time.time() return 60-(ctime-self.history[-1])
二、内置频率组件
第一步 需要写一个频率类 继承SimpleRateThrottle
1.1 重写get_cache_key 返回self.get_ident(request)
1.2 重点 一定要配置一个scop=一个字符串
class Throttle(SimpleRateThrottle): scope = 'zk' def get_cache_key(self, request, view): # 返回什么值就以什么做过滤,返回用户的ID 就用用户id过滤 return self.get_ident(request) # 内部其实返回的还是一个ip地址
第二步 在settings中配置
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES':{ 'zk':'3/m' 主要是前面是m就行 后面随便写什么都可以 }
局部使用:
class Books(APIView): throttle_classes = [Throttle, ] # 局部 # throttle_classes = [] def get(self, request): return Response('qqqqq')
全局使用:
REST_FRAMEWORK = { # 加一下这段话就行 这里注意的小bug就是 频率类不能再vies里面写 不然会报差错 'DEFAULT_THROTTLE_CLASSES': ['app01.utils.VisitThrottle.Throttle', ], 'DEFAULT_THROTTLE_RATES': { 'zk': '3/minute', } }
局部禁用:
class Books(APIView): throttle_classes = [] # 局部禁用 def get(self, request): return Response('qqqqq')
三、源码分析
1.首先进来先走as.view() 这里的as.view() 就是APIView 所以进入到APIView
2.因为APIView是的as.view() 是继承了父类的as.view()方法也就是View()类 在view()类中的as.view()是返回了dispatch()
方法所以我们进入dispatch()方法
3.进入initial()方法,找到最后一个就是我圈中的那个方法,就是频率组件
4.进入频率组件方法
5.进入get_throttles()
6.由于我分析的是系统内置的频率组件,然后系统内置的也是会调用到allow_request()方法,不管你是内置的频率组件还是
自定义的频率组件,都会重写allow_request(),所以程序走到这一步,由于是分析系统内置的频率组件,然后自己本身没有allow_request()
这个方法,所以会去他继承的父类去找这个方法。
7.进入SimpleRateThrottle()这个方法,点击图片下方的小圆圈,定位到当前代码,然后进入
allow_request()方法。
8.调用SimpleRateThrottle的时候就会进去加载他的__init__方法
9.进入parse_rate()方法拿到他的返回值 分别是3和60
10进去到自己本身继承的类的allow_request()方法
11.进入到rate的方法查看他的源码
12 结束
合集:
python_django
分类:
编程相关 / Python
, 编程相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了