django-rest-framework限流

在项目根目录下新建utils的文件

  • 新建throttling.py
from django_redis import get_redis_connection
from rest_framework.throttling import BaseThrottle
from django.conf import settings
import time class MyThrottle(BaseThrottle): def __init__(self):
# 定义实例化属性
self.remote_addr = None
self.throttle_times = settings.DEFAULT_THROTTLE_TIMES
self.throttle_seconds = settings.DEFAULT_THROTTLE_SECONDS def allow_request(self, request, view):
'''定义限流的处理逻辑'''
# 获取用户的id
# remote_addr = request.META.get('REMOTE_ADDR')
remote_addr = self.get_ident(request)
coon = get_redis_connection('default')
self.remote_addr = remote_addr
# 获取当前时间
current_time = int(time.time())
# 从左侧插入redis列表
coon.lpush(remote_addr, current_time)
# 保存最新5条信息
coon.ltrim(remote_addr, 0, self.throttle_times - 1)
# 获取总的5条记录
times_byte_list = coon.lrange(remote_addr, 0, self.throttle_times - 1)
# 将其中的byte转换成int
times_list = [int(_) for _ in times_byte_list]
# 判断是否符合条件
if coon.llen(remote_addr) < self.throttle_times:
return True
return times_list[0] - times_list[-1] > self.throttle_seconds def wait(self):
'''返回等待时长'''
coon = get_redis_connection('default')
first_time = coon.lindex(self.remote_addr, self.throttle_times - 1)
current_time = int(time.time())
return self.throttle_seconds - (current_time - int(first_time))
  • 自定义的截流类必须继承BaseThrottle, 且实现allow_request的成员方法
  • 返回为False表示不通过验证
  • wait方法返回一个int值,这个值会被返回到错误的信息中
  • 使用redis来操作访问记录
    • 采用列表的方式来存储
    • 采用用户的id地址来做键名
    • 定义配置来限制次数和时间段
    • 次数会被作为redis列表储存的长度

django-rest-framework限流的更多相关文章

  1. Django Rest framework序列化流程

    目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...

  2. Django Rest framework的限流实现流程

    目录 一 什么是throttle 二 Django REST framework是如何实现throttle的 三 Django REST framework中throttle源码流程 一 什么是thr ...

  3. rest framework之限流组件

    一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内 ...

  4. django rest framework 项目创建

    Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Rest Framework Django REST Framework可以在Django的基 ...

  5. 前后端分离djangorestframework——限流频率组件

    频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...

  6. Django Rest Framework(2)

    目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from rest ...

  7. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  8. Django Rest framework 之 节流

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  9. Django Rest framework 之 认证

    django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...

  10. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

随机推荐

  1. js 渐变运动框架

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported

    # 问题 是这样的,我.net core 2.1的项目,读取.获取Post请求内容的一段代码,大概这样: [HttpPost] public async Task<IActionResult& ...

  3. Python下载各种功能包出问题

    问题详情 点击之后出现 AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 解决方法 c ...

  4. Arch Linux开启SSH远程安装(1.5)

    现在你的眼前应该可以看到[root@archiso~]#的提示. 首先,建立目标机器的网络设置: 安装和升级软件包前,先让本地的包数据库和远程的软件仓库同步是个好习惯. [root@archiso~] ...

  5. python编码的原理以及写入文件中乱码的原因

    1.unicode可以理解为世界上所有字符的集合,它不对应二进制编码 2.详见: https://blog.csdn.net/qq_33692803/article/details/81321340 ...

  6. VLAN间的通信

    多臂路由/单臂路由 :实现不同VLAN间的通信 1.多臂路由 划分两个vlan,将主机划分到不同vlan中 配置ip地址,(注意:不同vlan在不同的网络下) 将交换机的两个端口分别与路由器连接,将这 ...

  7. Django redis的使用

    一 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  8. [模拟] Codeforces - 1191C - Tokitsukaze and Discard Items

    Tokitsukaze and Discard Items time limit per test 1 second memory limit per test 256 megabytes input ...

  9. Linux Ubuntu 开发环境配置 ——最具生产力工具一览

    Why Linux and Why exactly Ubuntu 首先这里就不做Mac,Linux,Windows三者之争了.只从个人角度分析下: Mac 不差钱(其实Mac作为超级本性价还行),不喜 ...

  10. flume面试题

    1 你是如何实现Flume数据传输的监控的使用第三方框架Ganglia实时监控Flume. 2 Flume的Source,Sink,Channel的作用?你们Source是什么类型?1.作用 (1)S ...