Django 限制用户访问频率的中间件的实现


Posted in Python onAugust 23, 2018

一、定义限制访问频率的中间件

common/middleware.py

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:]

二、将中间件加入配置文件

setting.py

MIDDLEWARE = [
  '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',
]

对使用 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'
# }
}

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

Python 相关文章推荐
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
解决uWSGI的编码问题详解
Mar 24 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
python3下pygame如何实现显示中文
Jan 11 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
pytorch中的inference使用实例
Feb 20 Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
浅谈Django的缓存机制
Aug 23 #Python
如何在python字符串中输入纯粹的{}
Aug 22 #Python
关于python列表增加元素的三种操作方法
Aug 22 #Python
Python Learning 列表的更多操作及示例代码
Aug 22 #Python
Python绘制的二项分布概率图示例
Aug 22 #Python
使用Python写一个量化股票提醒系统
Aug 22 #Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 #Python
You might like
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python判断有效的数独算法示例
2019/02/23 Python
简单了解django缓存方式及配置
2019/07/19 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
介绍一下RMI的基本概念
2016/12/17 面试题
IBatis持久层技术
2016/07/18 面试题
四年级语文教学反思
2014/02/05 职场文书
小学生秋游活动方案
2014/02/23 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
运动会通讯稿50字
2015/07/20 职场文书