Django 中间件之限制ip访问次数 和 黑名单

限制ip访问频率

import time
from django.utils.deprecation import MiddlewareMixin
from django.http.response import HttpResponse
from django.core.cache import caches

# 频率限制访问
class IpLimitMiddleware(MiddlewareMixin):
    def process_request(self,request):
        ip = request.META.get("REMOTE_ADDR")

        # 选择缓存的数据库 redis缓存
        cache = caches['redis_backend']

        # 首先缓存中,根据ip获取数据,假如没有数据,值为空列表 []
        requests = cache.get(ip,[])

        # 如果值存在,且当前时间 - 最后一个时间 > 30 则清洗掉这个值  这里我们插入请求的时间为头插
        while requests and time.time() -  requests[-1] > 30:
            requests.pop()

        # 若没有存在值,则添加,过期时间为30秒,这个过期时间与上面判断的30 保持一致
        requests.insert(0, time.time())
        cache.set(ip, requests, timeout=30)

        # 限制访问次数为 5 次
        print(len(requests))
        if len(requests) > 5:
            return HttpResponse("请求过于频繁,请稍后重试!")

黑名单

import time
from django.utils.deprecation import MiddlewareMixin
from django.http.response import HttpResponse
from django.core.cache import caches

# 频率限制访问
class IpLimitMiddleware(MiddlewareMixin):
    def process_request(self,request):
        ip = request.META.get("REMOTE_ADDR")

        # 选择缓存的数据库 redis缓存
        cache = caches['redis_backend']

        # 获取黑名单
        black_list = cache.get('black',[])
        
        if ip in black_list:
            return HttpResponse("黑名单用户!")
        
        requests = cache.get(ip,[])

        # 如果值存在,且当前时间 - 最后一个时间 > 30 则清洗掉这个值  这里我们插入请求的时间为头插
        while requests and time.time() -  requests[-1] > 60:
            requests.pop()

        # 若没有存在值,则添加,过期时间为30秒,这个过期时间与上面判断的30 保持一致
        requests.insert(0, time.time())
        cache.set(ip, requests, timeout=60)
        
        # 如果访问次数大于30次,假如黑名单,封2分钟
        if len(requests) > 30:
            black_list.append(ip)
            cache.set('black',black_list,timeout=60*2)

        # 限制访问次数为 5 次
        print(len(requests))
        if len(requests) > 5:
            return HttpResponse("请求过于频繁,请稍后重试!")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值