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 字典(Dictionary)操作详解
Mar 11 Python
Python程序设计入门(5)类的使用简介
Jun 16 Python
python监控文件或目录变化
Jun 07 Python
详细介绍Python的鸭子类型
Sep 12 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
将python文件打包成EXE应用程序的方法
May 22 Python
Django工程的分层结构详解
Jul 18 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 Python
opencv实现图像平移效果
Mar 24 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 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实现链结人气统计
2006/10/09 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
基于python爬虫数据处理(详解)
2017/06/10 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
会计做账心得体会
2016/01/22 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技