Django 限制用户访问频率的中间件的实现

作者:rayzz 时间:2023-12-17 20:19:19 

一、定义限制访问频率的中间件

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'
# }
}

来源:https://segmentfault.com/a/1190000016114237

标签:Django,访问,频率,限制
0
投稿

猜你喜欢

  • MySQL分区表的最佳实践指南

    2024-01-27 14:45:40
  • 在 Python 中使用 MQTT的方法

    2022-01-26 12:32:48
  • Python Matplotlib绘图基础详细教程

    2024-01-16 04:34:41
  • Django CBV类的用法详解

    2022-11-24 20:33:43
  • FrontPage2002简明教程八:站点的管理

    2008-09-17 11:36:00
  • Python 处理表格进行成绩排序的操作代码

    2022-08-25 02:49:36
  • django使用haystack调用Elasticsearch实现索引搜索

    2021-07-22 17:13:27
  • python 类详解及简单实例

    2023-05-17 17:17:32
  • javascript 常见汉字转换成拼音工具

    2008-03-03 16:54:00
  • 二级域名的解析指向ASP源码

    2007-10-19 19:13:00
  • python 定时器,实现每天凌晨3点执行的方法

    2023-06-25 12:32:01
  • python实现简单图片物体标注工具

    2021-09-07 21:31:50
  • 详解pytorch 0.4.0迁移指南

    2023-04-10 08:02:14
  • Python数据结构队列解决约瑟夫斯问题

    2022-01-07 03:20:53
  • Python代码使用 Pyftpdlib实现FTP服务器功能

    2022-02-11 16:40:55
  • 详解PHP变量传值赋值和引用赋值变量销毁

    2023-10-25 00:27:31
  • python调用cmd命令行制作刷博器

    2023-07-26 15:18:35
  • 网页推广设计的几个要点

    2011-01-10 20:41:00
  • SQL Server数据库查询优化的常用方法总结

    2008-12-10 14:43:00
  • 浅谈Python 的枚举 Enum

    2021-02-01 16:42:15
  • asp之家 网络编程 m.aspxhome.com