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中in在list和dict中查找效率的对比分析
May 04 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
浅述python2与python3的简单区别
Sep 19 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
python读取mat文件生成h5文件的实现
Jul 15 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
一个简单计数器的源代码
2006/10/09 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
JavaScript 动态创建VML的方法
2009/10/14 Javascript
jQuery知识点整理
2015/01/30 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
vue实现分页加载效果
2019/12/24 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python requests模块实例用法
2019/02/11 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
Python内置异常类型全面汇总
2020/05/28 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
python爬虫如何解决图片验证码
2021/02/14 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
介绍java中初始化块的使用
2012/09/11 面试题
留学推荐信怎么写
2014/01/25 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers