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中字典的基础知识归纳小结
Aug 19 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
python获取多线程及子线程的返回值
Nov 15 Python
详解tensorflow实现迁移学习实例
Feb 10 Python
python实现输入数字的连续加减方法
Jun 22 Python
python 反向输出字符串的方法
Jul 16 Python
Python多继承原理与用法示例
Aug 23 Python
python覆盖写入,追加写入的实例
Jun 26 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
Python try except else使用详解
Jan 12 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(2)
2006/10/09 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP加密解密实例分析
2015/12/25 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js读取cookie方法总结
2014/10/31 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
Python实现通过继承覆盖方法示例
2018/07/02 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
如何在django中运行scrapy框架
2020/04/22 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
信息专业学生学习的自我评价
2014/02/17 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
运动会100米广播稿
2015/08/19 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python