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执行系统命令的常见方法(全)
Oct 22 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Django实现快速分页的方法实例
Oct 22 Python
Python对象转换为json的方法步骤
Apr 25 Python
python实现银联支付和支付宝支付接入
May 07 Python
Python中字符串与编码示例代码
May 20 Python
HTML的form表单和django的form表单
Jul 25 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
Django模型中字段属性choice使用说明
Mar 30 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
基于python实现银行管理系统
Apr 20 Python
Python数据分析入门之数据读取与存储
May 13 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
学校卫生检查制度
2014/02/03 职场文书
网络技术专业求职信
2014/05/02 职场文书
培训研修方案
2014/06/06 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android