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编程中包的概念与管理
Oct 16 Python
Python 爬虫图片简单实现
Jun 01 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
python对excel文档去重及求和的实例
Apr 18 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
python实现名片管理器的示例代码
Dec 17 Python
python主要用于哪些方向
Jul 05 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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实现图象锐化代码
2007/06/14 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python机器学习实战之树回归详解
2017/12/20 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
商务英语应届生自我鉴定
2013/12/08 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
运动会广播稿300字
2015/08/19 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL