前言
开发平台的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 = ["频率限制类", ] """
好了,就到这里吧.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]