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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python局域网ip扫描示例分享
Apr 03 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
python爬虫selenium模块详解
Mar 30 Python
Python Django 后台管理之后台模型属性详解
Apr 25 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
python实现会员信息管理系统(List)
Mar 18 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编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
php中in_array函数用法探究
2014/11/25 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
Python 递归函数详解及实例
2016/12/27 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python对象转换为json的方法步骤
2019/04/25 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
班级入场式解说词
2014/02/01 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
基层党员公开承诺书
2014/05/29 职场文书
毕业证代领委托书
2014/09/26 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
实习推荐信格式模板
2015/03/27 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
法律意见书范本
2015/06/04 职场文书
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js