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的Flask框架中实现简单的登录功能的教程
Apr 20 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
python创建文件备份的脚本
Sep 11 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
使用 Python 处理 JSON 格式的数据
Jul 22 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
python队列原理及实现方法示例
Nov 27 Python
Python logging日志模块 配置文件方式
Jul 12 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无限分类的深入理解
2013/06/02 PHP
cookie的secure属性详解
2015/04/08 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
python条件和循环的使用方法
2013/11/01 Python
使用Python对SQLite数据库操作
2017/04/06 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
电信专业应届生自荐信
2013/09/28 职场文书
群众路线剖析材料
2014/02/02 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
学校课外活动总结
2014/05/08 职场文书
环保建议书400字
2014/05/14 职场文书
商场父亲节活动方案
2014/08/27 职场文书
党课培训心得体会
2014/09/02 职场文书
教师个人考察材料
2014/12/16 职场文书
审美与表现自我评价
2015/03/09 职场文书
污水处理保证书
2015/05/09 职场文书
礼仪培训心得体会
2016/01/22 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers