思路:
1.获取访问ip和访问时间,并判断是否访问过
2.将同一ip的访问记录记在list中,并删除距当前访问时间超过x秒的记录
3.判断该ip访问次数,大于x则拒绝,否则正常流程并此次访问时间
将限制访问频率功能写在中间件的process_request方法中,简单的代码如下:
import time
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
visit_dic = {}
class Throttle(MiddlewareMixin):
def process_request(self,request):
global visit_dic
now = time.time()
ip = request.META.get("REMOTE_ADDR")
history_lst = visit_dic.get(ip,[])
new_lst = []
for i in history_lst:
if now - i <= 3:
new_lst.append(i)
if len(new_lst) > 10:
visit_dic[ip] = new_lst
return HttpResponse("too fast")
else:
new_lst.append(now)
visit_dic[ip] = new_lst