前言
开发平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用.
DRF就为我们提供了一些频率限制的方法.
DRF中的版本、认证、权限、频率组件的源码是一个流程,且频率组件在最后执行.
DRF频率组件原理
DRF中的频率控制基本原理是基于访问次数和时间的,当然我们也可以通过自己定义的方法来实现.
当请求进来,走到我们的频率组件时,DRF内部会有一个字典来记录访问者的IP.
以这个字典的IP为key,value为一个列表,存放访问者每次访问的时间:{PI1: [第三次访问时间, 第二次访问时间, 第一次访问时间, ]}
把每次访问的最新时间放入列表的最前面,记录这样一个数据结构后,通过如下方式限制:
如果我们设置的是10秒内只能访问5次:
1.判断访问者的IP是否在这个请求IP的字典里.
2.保证这个列表里都是都是最近10秒内访问的时间.
判断当前请求时间和列表里最早的(也就是最后一个)请求时间差
如果差大于10秒,说明请求不是最近10秒内的,删除掉最后一个
继续判断倒数第二个、第三个,直到差小于10秒为止
3.判断列表的长度(即访问次数)是否大于我们设置的5次.
如果大于,则限制其访问
如果小于,则放行,并把时间记录到列表的最前面
使用自带的频率限制类
首先 配置频率限制类
from rest_framework.throttling import SimpleRateThrottle # 导入内置的频率限制类 class DRFThrottle(SimpleRateThrottle): """注意:这里都是必备的属性、方法和返回值""" scope = 'WD' def get_cache_key(self, request, view): # 拿IP地址 return self.get_ident(request)
然后 配置文件
REST_FRAMEWORK = { # 指定频率限制的类 "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.DRFThrottle'], # WD是scope定义的值,3/m表示每分钟不能超过3次访问 "DEFAULT_THROTTLE_RATES": {"WD": "3/m"}, } """ 如果只是想给单个视图做频率限制: 则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项 并在要做频率限制的视图中指定频率限制类即可 指定语法:throttle_classes = ["频率限制类", ] """
开始测试
访问测试页面,连续刷新3次后,可看到:
使用自定义的频率限制类
首先 自定义频率限制类
import time VISIT_RECORD = {} # 限制访问次数的字典 class MyThrottle(): """ 自定义频率限制类,一分钟允许访问5次 注意:自定义频率限制类中必须要有allow_request和wait方法 前者用于频率限制的逻辑,后者用于返回限制时间还剩多少秒 """ def __init__(self): self.history = [] def allow_request(self, request, view): """用于限制访问的逻辑""" # 获取用户的IP地址 ip = request.META.get('REMOTE_ADDR') if ip not in VISIT_RECORD: VISIT_RECORD[ip] = [time.time(), ] else: history = VISIT_RECORD[ip] self.history = history history.insert(0, time.time()) # 确保访问时间在允许范围之内 while self.history[0] - self.history[-1] > 60: self.history.pop() # 确定访问次数在允许的范围内 if len(self.history) >= 5: return False return True def wait(self): """用于返回限制时间还剩多少秒""" return 60 - (self.history[0] - self.history[-1])
然后 配置文件
REST_FRAMEWORK = { # 指定自定义的频率限制类 "DEFAULT_THROTTLE_CLASSES": ['blog.throttle.MyThrottle'], } > """ 如果只是想给单个视图做频率限制: 则删除这里的"DEFAULT_THROTTLE_CLASSES"配置项 并在要做频率限制的视图中指定频率限制类即可 指定语法:throttle_classes = ["频率限制类", ] """
好了,就到这里吧.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】
- 谭咏麟.2022-倾·听【环球】【WAV+CUE】
- 4complete《丛生》[320K/MP3][85.26MB]
- 4complete《丛生》[FLAC/分轨][218.01MB]
- 羽泉《给未来的你&天黑天亮》[WAV+CUE][968M]
- 庄心妍《我也许在等候》[低速原抓WAV+CUE]
- 王雅洁《小调歌后2》[原抓WAV+CUE]
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV