DRF 用户频率限制


为什么要限流

1 防爬虫

匿名用户 无法限制,代理
已登录,用户名限制;买代理

2 提供服务(接口--不同用户的访问次数不一样)

 vip 限制访问次数

BaseThrottle 自定义 allow_reques,wait t实现用户 ip 访问限制

RECORD = {} # 定义在全局的 记录(记录ip访问)

class MyThrottle(BaseThrottle):
def allow_request(self,request,view):
"""
:param request:
:param view:
:return:
"""
'''
a. 对匿名用户进行限制,每个用户1分钟只允许访问10次
--获取用户IP
'''
import time
ctime = time.time()
ip = self.get_ident(request) # 获取 ip地址
if ip not in RECORD:
RECORD[ip] = [ctime,]
else:
time_list = RECORD[ip]
while True:
first_time = time_list[-1]
if ctime - 60 > first_time:
time_list.pop()
else:
break
if len(time_list) > 10:
return False
time_list.insert(0,ctime)
return True def wait(self): # 显示剩余时间
ip = self.get_ident()
ip_list = RECORD[ip]
import time
ctime = time.time()
remain_time = 60 - ctime + ip_list[-1]
return remain_time

继承 SimpleRateThrottle -- get_cache_key实现

class MySimpleThrottle(SimpleRateThrottle):

    scope = 'WDP'  # 配置 'DEFAULT_THROTTLE_RATES':{'WDP':'3/m'}

    def get_cache_key(self, request, view):
return self.get_ident(request) # 设置 ip 为 cache记录的 key settings 中 REST_FRAMEWORK = {
'UNAUTHENTICATED_USER':None,
'UNAUTHENTICATED_TOKEN':None,
# 'DEFAULT_AUTHENTICATION_CLASSES':[
# 'goods.utils.MyAuthentication'
# ],
'DEFAULT_THROTTLE_RATES':{
'WDP':'3/m'
}
} DRF 的 ip 访问 记录默认放在 cache中,可以通过配置文件 修改缓存方式 返回ip(匿名),或者user(登录) class AnonyThrottle(SimpleRateThrottle):
scope = 'WDP_ANONNY' # 配置 'DEFAULT_THROTTLE_RATES':{'WDP':'3/m'}
def get_cache_key(self, request, view):
if request.user:
return None
return self.get_ident(request) # 设置 ip 为 cache访问记录的 key class UserThrottole(SimpleRateThrottle):
scope = 'WDP_USER'
def get_cache_key(self, request, view):
if request.user:
return request.user # 设置 user 为cache访问记录的key
return None class VIPThrottole(SimpleRateThrottle):
scope = 'WDP_VIP'
def get_cache_key(self, request, view):
if request.user and request.user == 'ale':
return request.user
return None

IP 访问控制的 提示信息

def throttled(self, request, wait):
"""
If request is throttled, determine what kind of exception to raise.
"""
class MyThrottole(exceptions.Throttled):
default_detail = '限制访问.'
extra_detail_singular = '需要再等 {wait} 秒.'
extra_detail_plural = '需要再等 {wait} 秒.'
raise MyThrottole(wait)

获取请求的IP

request.META.get('REMOTE_ADDR')

DRF 用户频率限制的更多相关文章

  1. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  2. DRF 权限 频率

    DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员 ...

  3. python 全栈开发,Day104(DRF用户认证,结算中心,django-redis)

    考试第二部分:MySQL数据库 6.  MySQL中char和varchar的区别(1分) char是定长,varchar是变长. char的查询速度比varchar要快. 7.   MySQL中va ...

  4. Django Rest Framework之用户频率/访问次数限制

    内置接口代码基本结构 settings.py: REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':['api.utils.mythrottle.UserThr ...

  5. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...

  6. drf的频率认证

    频率认证源码分析 APIView --->dispatch方法--->self.initial(request, *args, **kwargs)---> self.check_th ...

  7. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

  8. DRF的权限和频率

    DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...

  9. 8) drf 三大认证 认证 权限 频率

    一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...

随机推荐

  1. pandas(四)唯一值、值计数以及成员资格

    针对Series对象,从中抽取信息 unique可以得到Series对象的唯一值数组 >>> obj = Series(['c','a','d','a','a','b','b','c ...

  2. Django框架之ORM(数据库)操作

    一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...

  3. LeetCode:前K个高频元素【347】

    LeetCode:前K个高频元素[347] 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [ ...

  4. 在vps主机上***

    一.安装 Shadowsocks服务端: 1.下载软件包 yum install python-setuptools && easy_install pip pip install s ...

  5. maven项目,去除jar包中的不想要的依赖关系

    解释:就是说项目中要用到某一个a.jar包,通过maven引入了之后,也自动的导入了该jar包所依赖的包,这里就会存在一个问题,如果a.jar包依赖b.jar这个项目的1.0版本,可是我的项目中已经有 ...

  6. 【转】React Native中ES5 ES6写法对照

    很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...

  7. NaviCat Primium远程连接Oracle 11g数据库操作方法

    说明:作者使用的系统是windows 10 64位系统,使用的软件及插件都是基于64位系统进行安装.一. 软件准备 1.windows 10 64位 操作系统 2.NaviCat Primium 11 ...

  8. Spring_通过注解配置 Bean(1)

    beans-annotation.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns ...

  9. Spring_通过 FactoryBean 配置 Bean

    beans-factorybean.xml <?xml version="1.0" encoding="UTF-8"?><beans xmln ...

  10. jedis客户端,取redis服务的值

    package com.common.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...