Django限制API访问频率常用方法解析


Posted in Python onOctober 12, 2020

需求描述:

平台中需要编写接口供第三方调用,需要控制调用频率,需求为5s内调用一次后不得再次调用。

解决思路

1.Django官方插件库中有个django-ratelimit插件可以满足要求, django-ratelimit文档地址,很灵活很强大。只需要在我们的views函数上加上

@ratelimit(key='ip', rate='1/30s', block=True)
装饰器就可以了,网站上的资料不多,大部分都是英文的。在这里稍微解释下参数:

key='ip', 必填项,标识按照IP划分,我理解的是同一IP,遵循后面参数设定的规则。

rate='1/30s',必填项,设置的频率值,这个意思是30秒内执行一次,也可以按照 “分”,“时”,“日” 等划分,很灵活的配置,比如每分钟执行5次,可以这样写rate='5/m',这里参考文档足够弄明白

block=True,在这里吃了个亏,默认是False,加上了装饰器没写该参数,访问不受限制,没有达到间隔时间内不能再访问的预期效果,果断回去翻文档,

谷歌翻译:False是否阻止请求而不是注释。

我理解大概的意思是,当访问进来的时候是否去阻止它,把block=True之后,在次测试访问,可以看到403,确实是阻止了。

还有其它的参数,有更多需求的话可以看看,这是其一。

2.通过session存储访问时间

这里其实有两种方式,第一是写在中间件中,第二是装饰器,每个人需求不一样,我这一大堆函数就几个需要给外部调用的,干脆就做了装饰器,先贴码:

def limit(seconds = 5):
'''
@func: 限制访问频率装饰器
'''
def rate_limit(func):
def func_limit(request):
now=time.time()
request_time = request.session.get('request_time',0)
interval_time = int(now - request_time)
if interval_time < seconds:
ret = ret_content(20008,'%s 秒后可再次访问'%(seconds-interval_time))
return JsonResponse(ret)
else:
request.session['request_time'] = time.time()
ret = func(request)
return ret
return func_limit
return rate_limit
def ret_content(ret_code,message):
return {'ret_code':ret_code,'message':message}

大概思路是:将当前访问的时间存session,设置时间间隔,当在时间间隔之内的时候,不让其刷新,并返回json,超过时间间隔,更新session,让其执行。使用如下:

@limit(seconds=30)

30s内执行一次,我这个乞丐版的没第一种方法灵活了,不过在禁止期间返回的结果值会比较友好,不是403。程序处理会比较方便,另外针对IP的情况,我这里没做处理,需要的话自己可以改改,把request_time换成IP + Salt方式就可以了。

外部IP地址获取代码这里也贴出来:

def get_remote_cli_ip(request):
'''
@func:获取客户端ip
'''
ip = request.META.get('HTTP_X_FORWARDED_FOR',0)
if ip == 0:
return request.META['REMOTE_ADDR']
else:
return ip

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现选择排序
Jun 04 Python
Python使用smtp和pop简单收发邮件完整实例
Jan 09 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
Django csrf 验证问题的实现
Oct 09 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
Python常用扩展插件使用教程解析
Nov 02 Python
python IP地址转整数
Nov 20 Python
Python socket如何解析HTTP请求内容
Feb 12 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 #Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 #Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 #Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 #Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 #Python
Python Sqlalchemy如何实现select for update
Oct 12 #Python
浅析PyCharm 的初始设置(知道)
Oct 12 #Python
You might like
php生成静态页面的简单示例
2014/04/17 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
JQuery UI皮肤定制
2009/07/27 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python实现推箱子游戏
2020/03/25 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
公司门卫的岗位职责
2014/02/19 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis