DRF的限流组件(源码分析)-世界消息
2023-04-22 04:37:52
(相关资料图)
限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷。
对于匿名用户,使用用户IP作为唯一标识。对于登录用户,使用用户ID或名称作为唯一标识。缓存={用户标识:[12:33,12:32,12:31,12:30,12,] 1小时/5次 12:34 11:34{
1. 配置缓存# settings.pyCACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PASSWORD": "qwe123", } }}
2. 自定义限流类# -*- encoding:utf-8 -*-# @time: 2023/4/21 15:41# @author: ifengfrom django.core.cache import cache as default_cachefrom rest_framework import exceptionsfrom rest_framework import statusfrom rest_framework.throttling import SimpleRateThrottleclass ThrottledException(exceptions.APIException): status_code = status.HTTP_429_TOO_MANY_REQUESTS default_code = "throttled"class MyRateThrottle(SimpleRateThrottle): cache = default_cache # 访问记录存放在django的缓存中(需设置缓存) scope = "user" # 构造缓存中的key cache_format = "throttle_%(scope)s_%(ident)s" # 设置其他访问评率, 例如: 一分钟允许访问10次 # 其他: "s": "sec", "m": "min", "h": "hour", "d": "day" THROTTLE_RATES = {"user": "10/m"} def get_cache_key(self, request, view): if request.user: ident = request.user.id else: ident = self.get_ident(request) # 获取请求用户IP(request中找请求头) # throttle_u # throttle_user_11.11.11.11ser_2 return self.cache_format % {"scope": self.scope, "ident": ident} def throttle_failure(self): wait = self.wait() detail = { "code": 1005, "data": "访问频率限制", "detail": "需要等待 %s s才能访问" % (int(wait)) } raise ThrottledException(detail)
3. 使用限流类局部配置(views)class UserView(APIView): throttle_classes = [MyRateThrottle, ] # 限流
全局配置(settings)REST_FRAMEWORK = { # 限流 "DEFAULT_THROTTLE_CLASSES": ["app01.throttle.MyRateThrottle", ], "DEFAULT_THROTTLE_RATES": { "user": "10/m", # "xx":"100/h" }}
4. 多个限流类本质,每个限流的类中都有一个 allow_request
方法,此方法内部可以有三种情况:
标签:
- DRF的限流组件(源码分析)-世界消息
- 公示“色狼”姓名引争议?警方回应:合规
- 科拓生物雪上加霜
- 有稜有角打一字(有稜有角是什么生肖)
- 什么是无机物_什么是有机物 天天快消息
- 中国累计建成5G基站逾264万个
- 爱美客:截至2023年4月20日,公司股东人数为31,087户
- 吉普车10万左右越野车_吉普车10万左右
- 【速看料】微博头像相册删除了怎么恢复_微博头像相册怎么删除
- 焦点简讯:冷空气到来前,为什么天气更热?气象专家这么说
- 四川99门课程入选!教育部公布名单
- 阿弥陀佛是谁(阿弥陀佛是谁)|全球聚看点
- 泸州老窖:公司拥有数十万吨的基酒储存能力,不同产品有不同的储存时间要求_环球焦点
- 实名制注册(cf实名制注册)
- 艺多不压身还是技多不压身_艺多不压身-世界快看点
- 片仔癀美白效果怎么样_片仔癀祛斑效果怎么样
- 枧水制作方法_下厨房_枧水的制作方法|天天快资讯
- 智能数据驱动的复杂工业流程的故障诊断与分析_对于智能数据驱动的复杂工业流程的故障诊断与分析简单介绍
- 重庆弘钢建设工程监理咨询有限公司违反《重庆市建设工程安全生产管理办法》被罚款
- 两队第三场比赛将回到广东队主场进行胜者晋级四强
- 4月21日减速器板块跌幅达3%
- 军工板块拉升走高,中国卫通涨停,华如科技、本川智能等大涨
- 如何从需求出发,挑选一块适合自己的固态硬盘?
- 上海六旬阿姨四处交友,索要水果作为见面礼,然后一波操作诈骗5名受害人4000余元
- 大爷买包子付196956元 到底怎么回事??
- 全球信息:半导体及元件板块盘初走低
- 百合是什么意思_百合什么意思
- 洛基的权杖来龙去脉_洛基的权杖
- 全球观焦点:和龙市气象局发布森林火险气象蓝色预警【IV级/一般】
- 恒瑞医药(600276.SH):一季度净利润12.39亿元 同比增长0.17% 全球热闻
x
广告
x
广告