热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3Tornado限制IP在时间段内请求次数

原因:有个接口服务需要限制接口请求次数。 处理逻辑:1、新建空列表;2、有IP访问则记录IP、时间、次数; eg: [{'192.168.1.124':{�

原因:有个接口服务需要限制接口请求次数。

 


处理逻辑:

1、新建空列表;

2、有IP 访问则记录 IP、时间、次数;  eg: [{'192.168.1.124': {'2020-12-08 17:00:33': 10}}, {'192.168.1.125': {'2020-12-08 17:00:33': 9}}]

3、判断当前时间和列表中的IP访问时间是否相同:

      ①、相同则增加访问次数;

      ②、不同则更改原有的访问时间和次数;

4、同一秒访问10次则限制3分钟后再访问;

5、防止列表一直存储着信息,需要在限制的时候清空,防止占满内存。


代码:

import datetime # 时间包
#第三方 格式化时间包 pip install python-dateutil
from dateutil.relativedelta import relativedelta
expire_time = '' # 过期时间
iplist = [] # 存放访问的IP 格式 [{'192.168.1.124': {'2020-12-08 17:00:33': 10}}, {'192.168.1.125': {'2020-12-08 17:00:33': 9}}]
def counts(host):
global expire_time, iplist
key_list = [] # 临时存储列表中的IP键
index_list = {} # 临时存储列表中的下标值
datetimes = datetime.datetime.now()
nowtime = datetimes.strftime("%Y-%m-%d %H:%M:%S") # 转化成字符串便于存储
print('nowtime', nowtime)
if expire_time == '': # 判断无过期时间
if iplist: # 判断有访问IP
for index, item in enumerate(iplist): # 将原有的访问IP遍历出来
tmp_key = tuple(item.keys())[0] # 取出第一层字典键
if tmp_key not in key_list: # 不在临时IP存储列表中
key_list.append(tmp_key) # 不在临时IP列表则加入
tmp_key_dict = {tmp_key: index} # 拼接新临时存储IP下标,方便从IPlist中取值
index_list.update(tmp_key_dict) # 更新到临时存储IP字典中
print('iplist', iplist)
print("key_list", key_list)
print("index_list", index_list)
if host in key_list: # 在列表中则判断时间和次数
index = index_list[host] # 取IP在IPList中的下标
item = iplist[index] # 取出IPList对应的字典值
times_key = tuple(item[host].keys())[0] # 取出IPList的第二层时间键
# 转为时间格式进行时间间隔计算
time_key = datetime.datetime.strptime(times_key, '%Y-%m-%d %H:%M:%S')
# print("时间格式",type(datetimes - time_key),datetimes - time_key)
# >>> 时间格式 0:00:00.213644
# datetime.timedelta 格式数据通过 .seconds取相差的秒数,取分钟及其他类型会报错,有了解的大佬欢迎在评论区指教!
if (datetimes - time_key).seconds == 0: # 时间相同 则判断是否超过10次
if item[host][times_key] >= 10: # 同一秒访问等于或大于10 就不允许请求接口了
# 设置过期时间
expire_time = (datetimes + relativedelta(minutes=+3)).strftime("%Y-%m-%d %H:%M:%S")
iplist = [] # 重置记录列表
# 返回限制结果
return {'code': -1, 'msg': "Error", 'data': "访问频率过快,请3分钟后再访问!"}
else: # 不等于10次 则增加该IP请求次数
num = item[host].get(times_key, 1) + 1 # 取出该字典的次数+1
item[host][times_key] = num # 重新赋值给该IP
else: # 时间不同则重新给IP计数
item[host] = {nowtime: 1} # 重置该IP访问次数
else: # 表示第一次访问接口
tmp_data = {host: {nowtime: 1}} # 构建该IP的访问次数
iplist.append(tmp_data) # 添加到列表中
else: # 判断无访问IP即表示第一次访问接口
tmp_data = {host: {nowtime: 1}} # 构建该IP的访问次数
iplist.append(tmp_data) # 添加到列表中
else: # 限制时间已过就可以访问接口
if nowtime == expire_time:
tmp_data = {host: {nowtime: 1}} # 构建该IP的访问次数
iplist.append(tmp_data) # 添加到列表中
else: #限制时间未过则需要返回限制结果,否则返回None
iplist = [] # 重置记录列表
return {'code': -1, 'msg': "Error", 'data': "访问频率过快,请3分钟后再访问!"}
if __name__ == '__main__':
for i in range(11):
print('遍历的次数:【%s】' % i)
print(counts("192.168.1.124"))
print(counts("192.168.1.125"))

 

本文地址:https://blog.csdn.net/qq_42142258/article/details/110877394



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
yanghuimin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有