django 基于中间件实现限制ip频繁访问过程详解


Posted in Python onJuly 30, 2019

额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现

浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理,我们还需要知道是哪个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='2')

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 = '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

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类型

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
使用python实现baidu hi自动登录的代码
Feb 10 Python
python中sys.argv参数用法实例分析
May 20 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
Python实现简单登录验证
Apr 13 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Python常见数据类型转换操作示例
May 08 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
python操作gitlab API过程解析
Dec 27 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
python中24小时制转换为12小时制的方法
Jun 18 Python
python3安装crypto出错及解决方法
Jul 30 #Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 #Python
Python实现性能自动化测试竟然如此简单
Jul 30 #Python
python爬虫 execjs安装配置及使用
Jul 30 #Python
python 实现识别图片上的数字
Jul 30 #Python
django框架模型层功能、组成与用法分析
Jul 30 #Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 #Python
You might like
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
js类型检查实现代码
2010/10/29 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
入党自我评价范文
2014/02/02 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
详解Python为什么不用设计模式
2021/06/24 Python
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题