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读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
Python分析学校四六级过关情况
Nov 22 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
详解Django rest_framework实现RESTful API
May 24 Python
python使用webdriver爬取微信公众号
Aug 31 Python
python多进程控制学习小结
Oct 31 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
numpy数组之存取文件的实现示例
May 24 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python实现进度条和时间预估的示例代码
Jun 02 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 常用算法和时间复杂度
2013/07/01 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
基于vue实现分页效果
2017/11/06 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
简单的Python的curses库使用教程
2015/04/11 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
python名片管理系统开发
2020/06/18 Python
python与idea的集成的实现
2020/11/20 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
京东国际站:JOYBUY
2017/11/23 全球购物
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
婚前协议书
2014/04/15 职场文书
《海底世界》教学反思
2014/04/16 职场文书
药剂专业求职信
2014/06/20 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
商家认证委托书格式
2014/10/16 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers