Django 对IP访问频率进行限制的例子


Posted in Python onAugust 30, 2019

REST_FRAMEWORK 配置

对使用 rest_framework 框架的项目来说,可以使用框架的设置来对api的访问频率进行限制

REST_FRAMEWORK = {
   'DEFAULT_PARSER_CLASSES': (
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser',
  ),

  'DEFAULT_AUTHENTICATION_CLASSES': (
    # 'lecare.core.rest_auth.CrossSiteSessionAuthentication',
  ),

  'DEFAULT_PERMISSION_CLASSES': [
    # 'rest_framework.permissions.IsAuthenticated',
    'rest_framework.permissions.AllowAny',
  ],

  'PAGE_SIZE': 20,
  'UNICODE_JSON': False,
  # 'COERCE_DECIMAL_TO_STRING': False,
  # 'EXCEPTION_HANDLER': 'lecare.core.custom_exception_handler.custom_exception_handler',
  'JWT_EXPIRATION_DELTA': datetime.timedelta(hours = 2),
  'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days = 360),
  'JWT_ALLOW_REFRESH': False,
  'JWT_AUTH_HEADER_PREFIX': 'JWT',
  'JWT_PAYLOAD_HANDLER': 'consumer.jwt_conf.jwt_payload_handler',
  'JWT_RESPONSE_PAYLOAD_HANDLER': 'consumer.jwt_conf.jwt_response_payload_handler',
  'JWT_GET_USER_SECRET_KEY': 'consumer.jwt_conf.jwt_get_secret_key',
  # 'DEFAULT_THROTTLE_CLASSES': (
  #   # 开启匿名用户接口请求频率限制
  #   'rest_framework.throttling.AnonRateThrottle',
  #   # 开启授权用户接口请求频率限制
  #   'rest_framework.throttling.UserRateThrottle'
  # ),
  # 'DEFAULT_THROTTLE_RATES': {
  #   # 频率限制有second, minute, hour, day
  #   # 匿名用户请求频率
  #   'anon': '30/second',
  #   # 授权用户请求频率
  #   'user': '30/second'
  # }
}

使用middleware中间件来限制IP频率

import time
from django.utils.deprecation import MiddlewareMixin
MAX_REQUEST_PER_SECOND=2 #每秒访问次数

class RequestBlockingMiddleware(MiddlewareMixin):
  def process_request(self,request):
    now=time.time()
    request_queue = request.session.get('request_queue',[])
    if len(request_queue) < MAX_REQUEST_PER_SECOND:
      request_queue.append(now)
      request.session['request_queue']=request_queue
    else:
      time0=request_queue[0]
      if (now-time0)<1:
        time.sleep(5)
      request_queue.append(time.time())
      request.session['request_queue']=request_queue[1:]

#启用RequestBlocking中间件
IDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'common.middleware.RequestBlockingMiddleware', #在sessions之后,auth之前
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

以上这篇Django 对IP访问频率进行限制的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python之list对应元素求和的方法
Jun 28 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
Python单元测试与测试用例简析
Nov 09 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Python实现手势识别
Oct 21 Python
python编写扎金花小程序的实例代码
Feb 23 Python
关于Python3 类方法、静态方法新解
Aug 30 #Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 #Python
简单的Python调度器Schedule详解
Aug 30 #Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 #Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 #Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 #Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 #Python
You might like
解析php如何将日志写进syslog
2013/06/28 PHP
php基本函数汇总
2015/07/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
详解vue axios中文文档
2017/09/12 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
python实现解数独程序代码
2017/04/12 Python
聊聊Python中的pypy
2018/01/12 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
canvas线条的属性详解
2018/03/27 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
初中学校军训方案
2014/05/09 职场文书
村抢险救灾方案
2014/05/09 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
公司地址变更通知
2015/04/25 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript