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益智游戏计算汉诺塔问题示例
Mar 05 Python
python字符类型的一些方法小结
May 16 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
python3.4爬虫demo
Jan 22 Python
python 定时任务去检测服务器端口是否通的实例
Jan 26 Python
Python实现Selenium自动化Page模式
Jul 14 Python
Django中Middleware中的函数详解
Jul 18 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
python 读取串口数据的示例
Nov 09 Python
python 通过exifread读取照片信息
Dec 24 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Python3 assert断言实现原理解析
2020/03/02 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
python中def是做什么的
2020/06/10 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
2019年Java面试必问之经典试题
2012/09/12 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
高中生自我评语大全
2014/01/19 职场文书
表彰先进的通报
2014/01/31 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
个性发展自我评价2015
2015/03/09 职场文书
捐书仪式主持词
2015/07/04 职场文书
汽车销售合同文本
2019/08/08 职场文书
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
MySQL存储过程及语法详解
2022/08/05 MySQL