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获取DLL和EXE文件版本号的方法
Mar 10 Python
Python的Django框架中的数据库配置指南
Jul 17 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
Python算法之图的遍历
Nov 16 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
python实现可视化动态CPU性能监控
Jun 21 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
Python 3.9的到来到底是意味着什么
Oct 14 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP音乐采集(部分代码)
2007/02/14 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
php共享内存段示例分享
2014/01/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php中stdClass的用法分析
2015/02/27 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
php的4种常用运行方式详解
2016/12/22 PHP
php探针不显示内存解决方法
2019/09/17 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
js实现选项卡效果
2020/03/07 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
总结30个CSS3选择器
2017/04/13 HTML / CSS
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
应届生高等护理求职信
2013/10/12 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
雷人标语集锦
2014/06/19 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
国庆庆典邀请函
2015/02/02 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
高一化学教学反思
2016/02/22 职场文书