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 anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
python:print格式化输出到文件的实例
May 14 Python
Python3爬楼梯算法示例
Mar 04 Python
Python玩转加密的技巧【推荐】
May 13 Python
Django中ORM外键和表的关系详解
May 20 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python之拟合的实现
Jul 19 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 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/08/11 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
css配合jquery美化 select
2013/11/29 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JavaScript中的this机制
2016/01/30 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
webpack4简单入门实例
2018/09/06 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
Python读取Excel的方法实例分析
2015/07/11 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
Python API len函数操作过程解析
2020/03/05 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
事业单位请假制度
2014/01/13 职场文书
实习护士自荐信
2014/06/21 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
安全生产奖惩制度
2015/08/06 职场文书
Python中基础数据类型 set集合知识点总结
2021/08/02 Python