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调用java的Webservice示例
Mar 10 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
Python处理JSON数据并生成条形图
Aug 05 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
python 文件查找及内容匹配方法
Oct 25 Python
Python实现的各种常见分布算法示例
Dec 13 Python
Python基础教程之异常详解
Jan 10 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
python Canny边缘检测算法的实现
Apr 24 Python
解决django框架model中外键不落实到数据库问题
May 20 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
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
分享php分页的功能模块
2015/06/16 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
Display SQL Server Version Information
2007/06/21 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
Javascript的闭包详解
2014/12/26 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
PyCharm代码格式调整方法
2018/05/23 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
python绘制漏斗图步骤详解
2019/03/04 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
如何理解Python中包的引入
2020/05/29 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
消防安全检查制度
2014/02/04 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
2015入党个人自传范文
2015/06/26 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers