利用中间件简单限制客户端ip的访问频率
3.32 IP访问评率限制
如果我们想限制客户端ip的访问频率,我们可以使用中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse
from authDemo import settings
import datetime
class IpLimitMiddleware(MiddlewareMixin):
def process_request(self,request):
if request.META.get("HTTP_X_FORWARDED_FOR"):
ip = request.META["HTTP_X_FORWARDED_FOR"]
else:
ip = request.META["REMOTE_ADDR"]
now_min = datetime.datetime.now().minute
if ip in settings.BLACK_LIST: #查询ip是否在黑名单内
return HttpResponse("你已经被加入黑名单")
elif ip in settings.IP_LIST:
if settings.IP_LIST[ip]["min"] == now_min:
settings.IP_LIST[ip]["times"] += 1
if settings.IP_LIST[ip]["times"] >= settings.LIMIT_VISIT_TIMES: #判断用户访问次数是否太快,返回提醒用户
if settings.IP_LIST[ip]["times"] >= settings.MAX_VISIT_TIMES: #如果用户访问次数非常多,加入黑名单
settings.BLACK_LIST.append(ip)
return HttpResponse("访问频率过快")
else:
settings.IP_LIST[ip]["times"] = 0
settings.IP_LIST[ip]["min"] = now_min
else:
settings.IP_LIST[ip] = {"times":1,"min":now_min}
settings.py
里创建一个IP_LIST
字典,用来存储客户端ip和其他信息(其实可以单独放入数据库一个表中,不过从数据库中读取没有内存中读取快,访问速度会受到影响)- 如果用户使用代理
request.META["REMOTE_ADDR"]
抓不到真实地址,所以我们首先使用request.META["HTTP_X_FORWARDED_FOR"]
来获取用户真实地址 - 我们将其用户ip和访问次数储存,在
settings.py
中设置一个常量LIMIT_VISIT_TIMES
,超过这个次数不让用户访问网页;MAX_VISIT_TIMES
超过这个次数,将这个ip加入黑名单