django-rest-framework限流
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限流的更多相关文章
- Django Rest framework序列化流程
目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...
- Django Rest framework的限流实现流程
目录 一 什么是throttle 二 Django REST framework是如何实现throttle的 三 Django REST framework中throttle源码流程 一 什么是thr ...
- rest framework之限流组件
一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内 ...
- django rest framework 项目创建
Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Rest Framework Django REST Framework可以在Django的基 ...
- 前后端分离djangorestframework——限流频率组件
频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...
- Django Rest Framework(2)
目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from rest ...
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- Django Rest framework 之 节流
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 认证
django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...
- drf 认证、权限、限流、过滤、排序、分页器
认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...
随机推荐
- des 加密解密工具类
最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...
- 5分钟使用NetModular 完成通讯录 App 开发
原版连接:https://www.cnblogs.com/shanyou/p/12520894.html NetModular(后文简称NM)是 OLDLI 堪称艺术品级的应用开发框架,它基于经典领域 ...
- 基于 Roslyn 实现一个简单的条件解析引擎
基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...
- word文档常用的格式操作(分页、分节、每一节如何设置页码、以及生成目录)
分页: 分节: 自动生成目录:
- Java多线程并发05——那么多的锁你都了解了吗
在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ...
- sql语句的基本用法总结
一.sql语法 select */列名1,列名2... from 表名[连接查询 内连接/左连接 on条件] 必选的 where 条件 子查询/in/exists/between ... and .. ...
- 【转】不怕难之BlockingQueue及其实现
1. 前言 BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所 ...
- wpf xaml CS0426 错误原因
wpf 程序集中 类命名空间名称和类名不能相同,否则在 xaml生成 i.g.cs时,会导致 自动生成代码无法推到处是类型还是命名空间的问题. 触发这个错误的条件是类命名空间 与 类名相同 并 ...
- mpy开发物联网系列:1.mpy与服务器数据库方案
ini配置文件与非关系型数据库 在使用micropython开发esp32过程中,经常涉及到一些数据的配置读取,而esp32本身micropython难以安装很多数据库客户端的库,只能基于本地文件使用 ...
- VUE npm run dev 启动时,报了一大堆错误 Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 7.x
npm run dev 启动时,报了一大堆错误 Module build failed: Error: Missing binding E:\2017VocaSchool\vocationWeb\no ...