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读取一个目录下所有目录和文件的方法
Jul 15 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python绘制多个曲线的折线图
Mar 23 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
详解用python写一个抽奖程序
May 10 Python
python中的decimal类型转换实例详解
Jun 26 Python
python性能测量工具cProfile使用解析
Sep 26 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 Python
七个非常实用的Python工具包总结
Jun 15 Python
Opencv中cv2.floodFill算法的使用
Jun 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
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php数组合并的二种方法
2014/03/21 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
理解Javascript闭包
2013/11/01 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
Python多线程和队列操作实例
2015/06/21 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python应用库大全总结
2018/05/30 Python
python opencv实现运动检测
2018/07/10 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python lxml中etree的简单应用
2019/05/10 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
python中数字是否为可变类型
2020/07/08 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
python批量生成条形码的示例
2020/10/10 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
自动化专业本科毕业生求职信
2013/10/20 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
基层党支部承诺书
2015/04/30 职场文书
焦裕禄观后感
2015/06/03 职场文书
企业法人代表证明书
2015/06/18 职场文书