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 29 Python
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python实现定时发送qq消息
Jan 18 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python pyenv多版本管理工具的使用
Dec 23 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
PHP图片上传代码
2013/11/04 PHP
php输出xml属性的方法
2015/03/19 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
教育孩子心得体会
2014/01/01 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
采购求职信
2014/03/17 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
2016年教代会开幕词
2016/03/04 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android