2019-07-30 14:20:08 127浏览
今天千锋扣丁学堂Python培训老师给大家分享一篇关于django基于中间件实现限制ip频繁访问过程详解,首先浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理,我们还需要知道是哪个ip,在什么时候,请求了几次,这些数据是要知道,并且记录下来,所以我创建了一个表,来存放这些信息数据,下面我们一起来看一下吧。
class Host_info(models.Model): host = models.CharField(max_length=32) count = models.IntegerField() start_time = models.DateTimeField() is_lock = models.CharField(max_length=32,default='2')
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render, HttpResponse from app01 import models import datetime class Md1(MiddlewareMixin): def process_request(self, request): url = request.path if url.startswith('/favicon.ico'): return HttpResponse class Md2(MiddlewareMixin): def process_request(self, request): now_time = datetime.datetime.now() host = request.META.get('REMOTE_ADDR') ret = models.Host_info.objects.filter(host=host).first() if ret: aa = now_time - ret.start_time if aa.seconds >= 60: ret.count = 1 ret.start_time = now_time ret.is_lock = '2' ret.save() return None if aa.seconds < 60 and ret.is_lock == '1': return HttpResponse('登陆次数频繁,一分钟后再试') if ret.count < 4 and ret.is_lock == '2': if ret.count == 2: ret.is_lock = '1' ret.count = 0 ret.save() else: ret.count += 1 ret.start_time = now_time ret.save() return None else: models.Host_info.objects.create(host=host, start_time=now_time, count=1) return None
'mymiddleware.Md1', 'mymiddleware.Md2',
TIME_ZONE = 'Asia/Shanghai' USE_TZ = False
## 代码其实很简单,主要是逻辑处理,你是怎么想就用代码去实现。 ## 对了,这里的数据存储,你可以定义一个变量去存放存这些信息(也就是我数据表存放的这个) ## 这里唯一值得注意的就是时间了,你要很清楚知道时区这个问题。
aa = now_time - ret.start_time aa.seconds # 取到相差多少秒
【关注微信公众号获取更多学习资料】 【扫码进入Python全栈开发免费公开课】