标签:IP middleware time visit django 访问 ip
一.中间件的代码
注意:成功时返回的是None,那样才会走视图层,返回httpresponse就直接出去了
import time from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse # 访问IP池 visit_ip_pool = {} class RequestBlockingMiddleware(MiddlewareMixin): def process_request(self,request): # 获取访问者IP ip=request.META.get("REMOTE_ADDR") # 获取访问当前时间 visit_time=time.time() # 判断如果访问IP不在池中,就将访问的ip时间插入到对应ip的key值列表,如{"127.0.0.1":[时间1]} if ip not in visit_ip_pool: visit_ip_pool[ip]=[visit_time] return None # 然后在从池中取出时间列表 history_time = visit_ip_pool.get(ip) # 循环判断当前ip的时间列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, while history_time and visit_time-history_time[-1]>60: history_time.pop() # 如果访问次数小于10次就将访问的ip时间插入到对应ip的key值列表的第一位置,如{"127.0.0.1":[时间2,时间1]} print(history_time) if len(history_time)<10: history_time.insert(0, visit_time) return None else: # 如果大于10次就禁止访问 return HttpResponse("访问过于频繁,还需等待%s秒才能继续访问"%int(60-(visit_time-history_time[-1])))
二.在settings中的配置
这个很简单,一句话搞定
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # ip访问限制 'blog.middleware.RequestBlockingMiddleware', ]
最后注意:可能你页面的刷新不止一次访问服务端,这个得看你自己的代码了,所以你会错以为怎么限制10次和自己的设定的不一样
标签:IP,middleware,time,visit,django,访问,ip 来源: https://www.cnblogs.com/angelyan/p/10424663.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。