模拟一个客户端恶意请求服务器,如果在1分钟内请求了1000次,就将这个客户端的ip给禁了!
我们在middleswares.py文件下自定义一个中间件:
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
import datetime
#模存入用户ip的访问情况
HISTORY = {}
# 模拟存放被禁的ip名单数据表
BLACK_LIST=[]
class Throttle(MiddlewareMixin):
def process_request(self, request):
#拿到当前访问的时间
now = datetime.datetime.now()
# 拿到访问者的ip
ip = request.META.get("REMOTE_ADDR")
#判断此ip有没有被记录在黑名单如,如果有不让它继续访问
if ip in BLACK_LIST:
return HttpResponse('你的ip已经被禁了!')
# 判断一下当前ip有没有访问的histroy,如果没有就给它添加一个记录
if ip not in HISTORY:
HISTORY[ip] = {'last': now, 'times': 0}
# 做访问次数的逻辑判断,在1分钟内次数加1
if (now - HISTORY[ip]['last']) < datetime.timedelta(seconds=60):
HISTORY[ip]['times'] += 1
else:
# 超过一分钟就清空之前的记录,重新计算
HISTORY[ip]['times'] = 0
HISTORY[ip]['last'] = now
# 判断如果它的在一分钟之内,请求了1000次,将它的ip加入到黑名单内
if HISTORY[ip]['times'] > 1000:
BLACK_LIST.append(ip)
return HttpResponse('你的ip已经被禁了!')
将这个自定义的中间件配置上:
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',
'middleswares.Throttle',
]
运行效果: