DRF源码学习-Throttling
原创2021年8月29日
何为节流
节流,字面意思就是限制访问者的频率。一旦访问者超出设定频率,就会出现访问频繁限制。
如何节流
节流应该是针对发送请求的对象来准备的,不可能因为网站总的次数超限而去限制所有用户。所以要分为登录用户和未登录用户。
- 未登录:拿不到用户名,其标识就是访问者的IP地址
- 已登录:拿得到用户名,其标志就是其登录的用户名
接下来就是使用django内置的节流组件,来进行不同用户等级的节流
核心实现逻辑
自己实现节流组件
得益于drf内置的SimpleRateThrottle,可以很快做一个属于自己的节流
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
# 针对匿名访客
class VisitThrottle(SimpleRateThrottle):
scope = "anonymous"
def get_cache_key(self, request, view):
return self.get_ident(request)
# 针对用户
class UserThrottle(SimpleRateThrottle):
scope = "user"
def get_cache_key(self, request, view):
return request.user.username
settings文件,对每个规则,指定不同的频率。匿名一分钟5次,登录一分钟10次
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ["utils.throttle.UserThrottle"],
"DEFAULT_THROTTLE_RATES": {
"anonymous": '5/m',
"user": '10/m',
}
}
- 当未登录情况去访问,第六次的时候就提示超限。
- 当已登录情况去访问,第十一次的时候就提示超限。
Loading...