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 相关文章推荐
Python 第一步 hello world
Sep 25 Python
Python实现的二维码生成小软件
Jul 11 Python
Python解释执行原理分析
Aug 22 Python
python中退出多层循环的方法
Nov 27 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
python getpass实现密文实例详解
Sep 24 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
Python如何定义接口和抽象类
Jul 28 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
php中adodbzip类实例
2014/12/08 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
js函数在frame中的相互调用详解
2014/03/03 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
pygame实现弹力球及其变速效果
2017/07/03 Python
Python处理中文标点符号大集合
2018/05/14 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
python与字符编码问题
2019/05/24 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
python语言中有算法吗
2020/06/16 Python
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
招聘与培训专员岗位职责
2014/01/30 职场文书
经管应届生求职信范文
2014/05/18 职场文书
党员自我对照检查材料
2014/08/19 职场文书