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的Tqdm模块的使用
Jan 10 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
python基于http下载视频或音频
Jun 20 Python
python获取url的返回信息方法
Dec 17 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
django最快程序开发流程详解
Jul 19 Python
python 动态调用函数实例解析
Oct 21 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
基于Python 的语音重采样函数解析
Jul 06 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
pycharm 如何查看某一函数源码的快捷键
May 12 Python
一起来学习Python的元组和列表
Mar 13 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
关于php开启错误提示的总结
2019/09/24 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
django 多数据库及分库实现方式
2020/04/01 Python
python和php学习哪个更有发展
2020/06/17 Python
详解python的变量缓存机制
2021/01/24 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
卖房协议书
2014/04/11 职场文书
环境保护标语
2014/06/20 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
Mysql 文件配置解析介绍
2022/05/06 MySQL