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判断端口是否打开的实现代码
Feb 10 Python
全面解读Python Web开发框架Django
Jun 30 Python
Python Queue模块详解
Nov 30 Python
python实现web方式logview的方法
Aug 10 Python
python中requests和https使用简单示例
Jan 18 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python拼接字符串的7种方法总结
Nov 01 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
pytorch masked_fill报错的解决
Feb 18 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 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易混淆函数的区别及用法汇总
2014/11/22 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
比较完整的微信开发php代码
2016/08/02 PHP
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
使用python实现rsa算法代码
2016/02/17 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
怎么快速自学python
2020/06/22 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
本科毕业生的求职信范文
2013/11/20 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
人事任命书格式
2014/06/05 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
工程质量保证书
2015/05/09 职场文书
大国崛起日本观后感
2015/06/02 职场文书
羊脂球读书笔记
2015/06/30 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python