Django-利用AOP,cache缓存实现黑名单

功能:10次请求则禁止访问,30次请求则拉黑1天

原理:利用列表存储每个ip的请求时间戳,如果请求60秒内请求次数 > 10,禁止访问,>30则拉黑
AOP代码
import time
from django.core.cache import cache
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

# 设置数据结构:列表的头部插入,尾部弹出,列表中存放的是ip用户请求的时间戳
class DePaMiddleware(MiddlewareMixin):
	# 第一阶段进行切片
    def process_request(self, request):
		# 设置路径
        if request.path == "/index/":
        	# 获取用户的ip地址
            ip = request.META.get("REMOTE.ADDR")
			# 查找cache中是否有ip对应的values,如果没有,就设置成列表
            requests = cache.get(ip, [])
            # 清洗垃圾数据,找出时间差已经大于60s的
			# 用循环找出 当前时间-列表最后一个的时间,如果 > 60,则弹出
			# 此处在解释一下,因为设置列表为头进尾出,每次循环都找列表最后一个
			#    因为最后一个存放的时间离现在最久,一直循环,直到最后一个时间间隔 < 60
            while requests and time.time() - requests[-1] > 60:
                requests.pop()
			# 这一步中每个requests的时间间隔都<60了,那么就查看它的长度是否 > 10 
            if len(requests) >= 10:
                return HttpResponse("你被拦截了")
			# 在列表中加上每次访问的时间戳
 			requests.insert(0, time.time())
 			# ip为key,列表为value,过期时间为60s
            cache.set(ip, requests, timeout=60)
# 完整版:为了避免爬虫获取不到数据也在疯狂访问,我们给它加一个拉黑的功能
class DePaMiddleware(MiddlewareMixin):

    def process_request(self, request):

        if request.path == "/index/":
            ip = request.META.get("REMOTE.ADDR")
			# 设置黑名单
            black_list = cache.get("blackList", [])
			# 如果用户属于黑名单用户,则直接返回
            if ip in black_list:
                return HttpResponse("黑名单用户,凉凉")

            requests = cache.get(ip, [])
            print(requests)

            while requests and time.time() - requests[-1] > 60:
                requests.pop()
			# 无论访问是否成功,访问次数都要 +1
            requests.insert(0, time.time())
            cache.set(ip, requests, timeout=60)
			# 连续访问次数 >30,拉黑它,设置过期时间为60*60*24 = 1天
            if len(requests) > 30:
                black_list.append(ip)
                cache.set("blackList",black_list,timeout=60*60*24)
                return HttpResponse("你被拉黑了")

            if len(requests) >= 10:
                return HttpResponse("你被拦截了")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值