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获取当前时间的方法
Jan 14 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
python实现简单加密解密机制
Mar 19 Python
Python模块、包(Package)概念与用法分析
May 31 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
python求前n个阶乘的和实例
Apr 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
js中的闭包学习心得
2018/02/06 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
怎样自定义一个异常类
2016/09/27 面试题
毕业生动漫设计求职信
2013/10/11 职场文书
机电一体化自荐信
2013/12/10 职场文书
生物学学生自我评价
2014/01/17 职场文书
《画风》教学反思
2014/04/16 职场文书
化工工艺设计求职信
2014/06/25 职场文书
在职员工证明书
2014/09/19 职场文书
初二英语教学反思
2016/02/15 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang