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中使用enumerate函数遍历元素实例
Jun 16 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
python算法题 链表反转详解
Jul 02 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python logging日志模块 配置文件方式
Jul 12 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
python3 字符串str和bytes相互转换
Mar 23 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中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
JavaScript中的值类型转换介绍
2014/12/31 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
JS图片定时翻滚效果实现方法
2016/06/21 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
Python Web框架Tornado运行和部署
2020/10/19 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
教育学专业毕业生的自我评价
2013/11/21 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
团日活动总结书
2014/05/08 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
学雷锋团日活动总结
2015/05/06 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js