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脚本实时处理log文件的方法
Nov 21 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
django解决订单并发问题【推荐】
Jul 31 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
python的flask框架难学吗
Jul 31 Python
Python pymsql模块的使用
Sep 07 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
python中的列表和元组区别分析
Dec 30 Python
Python实现8种常用抽样方法
Jun 27 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 Python
聊聊Python String型列表求最值的问题
Jan 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
php 保留字列表
2012/10/04 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
跟老齐学Python之开始真正编程
2014/09/12 Python
详解Python中for循环的使用方法
2015/05/14 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
Python 中@property的用法详解
2020/01/15 Python
python多进程使用函数封装实例
2020/05/02 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
如何在Python对Excel进行读取
2020/06/04 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
日语系毕业生推荐信
2013/11/11 职场文书
物业保安岗位职责
2014/07/02 职场文书
商场促销活动总结
2014/07/10 职场文书
财务工作检讨书
2014/10/29 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
杨善洲观后感
2015/06/04 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
python 常用的异步框架汇总整理
2021/06/18 Python
python中subplot大小的设置步骤
2021/06/28 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB