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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
Python实现单词翻译功能
Jun 06 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
Python清空文件并替换内容的实例
Oct 22 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
python ---lambda匿名函数介绍
Mar 13 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
python开发人人对战的五子棋小游戏
May 02 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/09/19 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
JS 继承实例分析
2008/11/04 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
Python采集腾讯新闻实例
2014/07/10 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
django认证系统 Authentication使用详解
2019/07/22 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
三维科技面试题
2013/07/27 面试题
药学专业大学生个人的自我评价
2013/11/04 职场文书
正规的求职信范文分享
2013/12/11 职场文书
高一物理教学反思
2014/01/24 职场文书
村官个人总结范文
2015/03/03 职场文书
2015年测量员工作总结
2015/05/23 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
win10搭建配置ftp服务器的方法
2022/08/05 Servers