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实现一个简单的线程池
Apr 07 Python
Python解析json文件相关知识学习
Mar 01 Python
python妙用之编码的转换详解
Apr 21 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Python flask框架post接口调用示例
Jul 03 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
Python lambda表达式原理及用法解析
Aug 18 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 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操作数组的一些函数整理介绍
2011/07/17 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
Django中url的反向查询的方法
2018/03/14 Python
python安装pil库方法及代码
2019/06/25 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
python全栈开发语法总结
2020/11/22 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
德国网上花店:Valentins
2018/08/15 全球购物
法律进社区实施方案
2014/03/21 职场文书
求职信标题怎么写
2014/05/26 职场文书
公司活动总结范文
2014/07/01 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
工作岗位职责范本
2015/02/15 职场文书
质量保证书格式
2015/02/27 职场文书
城管年度个人总结
2015/02/28 职场文书
孔繁森观后感
2015/06/10 职场文书