利用中间件简单限制客户端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}
  1. settings.py里创建一个IP_LIST字典,用来存储客户端ip和其他信息(其实可以单独放入数据库一个表中,不过从数据库中读取没有内存中读取快,访问速度会受到影响)
  2. 如果用户使用代理request.META["REMOTE_ADDR"]抓不到真实地址,所以我们首先使用request.META["HTTP_X_FORWARDED_FOR"]来获取用户真实地址
  3. 我们将其用户ip和访问次数储存,在settings.py中设置一个常量LIMIT_VISIT_TIMES,超过这个次数不让用户访问网页;MAX_VISIT_TIMES超过这个次数,将这个ip加入黑名单
posted @ 2019-08-18 13:24  一颗桃子t  阅读(626)  评论(0)    收藏  举报