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 相关文章推荐
qpython3 读取安卓lastpass Cookies
Jun 19 Python
pytorch 数据集图片显示方法
Jul 26 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
python如何将图片转换素描画
Sep 08 Python
python 读取、写入txt文件的示例
Sep 27 Python
Python APScheduler执行使用方法详解
Dec 10 Python
python 将Excel转Word的示例
Mar 02 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
Python中的socket网络模块介绍
Jul 23 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图像处理类分享
2014/11/18 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
微信小程序云开发(数据库)详解
2019/05/17 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python pickle模块实现对象序列化
2019/11/22 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
收银员的岗位职责范本
2014/02/04 职场文书
对祖国的寄语大全
2014/04/11 职场文书
团拜会主持词
2015/07/04 职场文书
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript