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实现计算最小编辑距离
Mar 17 Python
Python实现二维有序数组查找的方法
Apr 27 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python字符串对象实现原理详解
Jul 01 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
django日志默认打印request请求信息的方法示例
May 17 Python
通过实例简单了解python yield使用方法
Aug 06 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新手上路(十四)
2006/10/09 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
Python实现命令行通讯录实例教程
2016/08/18 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
面试后的感谢信范文
2014/02/01 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
vue使用watch监听属性变化
2022/04/30 Vue.js