django-基于中间件实现限制ip频繁访问
########django-基于中间件写一个限制频繁登陆######## 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现 浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理,
我们还需要知道是哪个ip,在什么时候,请求了几次,这些数据是要知道,并且记录下来,所以我创建了一个
表,来存放这些信息数据 models文件:
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='') host:记录主机ip
count:记录请求的次数
start_time:记录请求的时间
is_lock:记录该ip的状态,默认为2 2代表未锁定,1代表锁定 接下来就是自定义中间件了,并写process_request方法,我们只对请求做处理,我先贴代码,最后写我遇到的一些问题 mymiddleware文件(我自定义的中间件): 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 = ''
ret.save()
return None
if aa.seconds < 60 and ret.is_lock == '':
return HttpResponse('登陆次数频繁,一分钟后再试') if ret.count < 4 and ret.is_lock == '':
if ret.count == 2:
ret.is_lock = ''
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 settings文件:
添加两行代码在MIDDLEWARE列表中:
'mymiddleware.Md1',
'mymiddleware.Md2', 并配置下面两句,原因后面会说
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False 遇到两个问题: 问题一:就是datetime,也就是时间分区问题,因为我数据表中需要保存到该ip访问的时间,存的时候存的是datetime对象
,但是我从数据库中取出来这个时间,进行比较会报出错误,错误类型忘记了,我就打印了从数据库中取出的时间数据,
发现,这个时间带着时区,而我datetime.datetime.now()的时间是本机时间,根本不能相减,相比较。网上收索才
知道django默认是有时间分区的,TIME_ZONE = 'UTC',USE_TZ = True,这两句。
解决方式:在setting文件中将上面那两句修改为TIME_ZONE = 'Asia/Shanghai',USE_TZ = False。这样就解决了。
在django中但凡出现时间的话,这个地方需要注意下。 问题二:额额这个问题,我在写的时候出现过,但是今天测试没那个问题,反正写上吧。我之前的错误就是我发出一个请求,首先
第一个请求就是访问到url,接着第二个请求就是发出favicon.ico这种类似的,请求ico这个。以这个情况来说问题吧,
你虽然在浏览器只发出一个请求,但是响应过来的网页,里面可以还有其他请求,所以这中情况需要考虑到。
解决方式:我在对用户ip做限制之前,加一个中间件,过滤掉其它的请求。,也就是上面的MD1。 ## 代码其实很简单,主要是逻辑处理,你是怎么想就用代码去实现。
## 对了,这里的数据存储,你可以定义一个变量去存放存这些信息(也就是我数据表存放的这个)
## 这里唯一值得注意的就是时间了,你要很清楚知道时区这个问题。 补充一点,datetime的一个用法
例子中我用到datetime对象之间相减,取差多少秒,也就是这句
aa = now_time - ret.start_time
aa.seconds # 取到相差多少秒
这里的aa是datetime.timedelta类型
django-基于中间件实现限制ip频繁访问的更多相关文章
- PHP禁止同一IP频繁访问以防止网站被防攻击或采集的代码
PHP禁止同一IP频繁访问以防止网站被防攻击或采集的代码 <?php /* *通过禁止IP频繁访问防止网站被防攻击代码*design by www.scutephp.com*/header('C ...
- django基于中间件的IP访问频率控制
一.中间件的代码 注意:成功时返回的是None,那样才会走视图层,返回httpresponse就直接出去了 import time from django.utils.deprecation impo ...
- 解决django不能以本机ip地址访问
在使用django框架来架设网站时,我们测试一般是通过django的开发服务器来完成,但是我们可以看到生成的地址是127.0.0.1:8000这样的话,我们在外网就无法访问了. 解决办法是通过传入第三 ...
- 【nodejs代理服务器四】代理服务器增加频繁访问的ip加入黑名单
问题 渗透者在扫站的时候会频繁请求,我们可以做一些策略来封堵这些频繁访问的ip,把ip加入黑名单. 策略 2秒之内访问次数超过100,加入黑名单. 实现思路 初次访问把访问Ip作为键,访问ip,时间, ...
- linux安全篇:禁止频繁访问的ip访问nginx
实验环境 版本:redhat6.5ip:172.16.1.100,172.16.10软件:nginx 172.16.1.10部署nginx [root@localhost tools]# lsngin ...
- django框架--中间件系统
目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...
- ########django-基于中间件写一个限制频繁登陆########
django-基于中间件写一个限制频繁登陆 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现 浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理 ...
- 15 Django组件-中间件
中间件 中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好 ...
- Django之中间件、缓存以及信号
Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...
随机推荐
- 研究SSIS时候的一些常见错误
1.[OLE DB 目标 [59]] 错误: SSIS 错误代码 DTS_E_OLEDBERROR.出现 OLE DB 错误.错误代码: 0x80004005.已获得 OLE DB 记录.源:“Mic ...
- windows环境下wampserver配置https
因为公司业务主要是在微信上进行开展的,所以作为程序员的我们每天的开发任务就都是在与微信打交道,这个时候我们就需要在本地配置端口映射到外网,方便我们在微信客户端进行调试. 最近某种需要,所以需要配置 h ...
- selendroid之toast处理
最近发现原来处理toast的操作失效了.仔细看了下原来的API.决定用switchTo来解决.driver.switchTo().defaultContent().findElement(By.id( ...
- zookeeper的JavaAPI
org.apache.zookeeper.Zookeeper Zookeeper 是在 Java 中客户端主类,负责建立与 zookeeper 集群的会话,并提供方法进行操作. org.apache. ...
- SQL Server ->> 在SQL Server中创建ASSEMBLY
首先要把数据库的TRUSTWORTHY属性改为ON ALTER DATABASE [MYDB] SET TRUSTWORTHY ON GO 接下来直接创建ASSEMBLY应该就没问题了.但是往往有可能 ...
- 详解Javaweb中常见漏洞的防御
上一篇给大家介绍了SpringMVC中常见的客户端数据输入点,这一篇给大家讲解下java中常见漏洞的防御方法. 0x01.sql注入 下面我们就用利用SpringMVC自带的数据库操作类jdbcTem ...
- python 之 BeautifulSoup标签查找与信息提取
一. 查找a标签 (1)查找所有a标签 >>> for x in soup.find_all('a'): print(x) <a class="sister" ...
- 再学UML-Bug管理系统UML2.0建模实例(二)
2.3 BMS顺序图(需求模型) 在UML中,我们将顺序图分为两类,一类用于描述系统需求,构造系统的需求模型(分析模型):另一类用于指导设计与实现,构造系统的实现模型(设计模型). ...
- ORACLE_SPOOL
Question:When you use developer tool in oracle.However,you press Ctrl and click left-mouse in a tabl ...
- 关于Oracle RAC节点间免密码策略
在RAC安装过程中无论grid或是Oracle软件都需要配置节点间免密码策略.配置方法网上有很多,oracle和可以帮你配置,此处不多说. 但是在RAC运行过程中是不需要免密码登陆的,所以在集群安装完 ...