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中使用异步Socket编程性能测试
Jun 25 Python
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python自动扫雷实现方法
Jul 25 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
Python 登录网站详解及实例
Apr 11 Python
Python工厂函数用法实例分析
May 14 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
Django项目创建及管理实现流程详解
Oct 13 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
Python 解决空列表.append() 输出为None的问题
May 23 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
关于手调机和数调机的选择
2021/03/02 无线电
PHP 和 HTML
2006/10/09 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
Python与Redis的连接教程
2015/04/22 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
大学生励志演讲稿
2014/04/25 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
2015元旦标语横幅
2014/12/09 职场文书
拾金不昧表扬信
2015/01/16 职场文书
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers