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. Ubuntu学习笔记3-图书知识点总结

    免费的虚拟机软件:vmware server Ubuntu下切换到root用户: 1,su 2, sudo -s 3, sudo+命令 Ubuntu下切换到一般用户: su chennan 软件包的安 ...

  2. [Python] Send emails to the recepients specified in Message["CC"]

    Recently, I'm working on a small program which needs to send emails to specific accounts. When I wan ...

  3. python16_day15【Django入门】

    一.Django基本 1.什么是框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表 ...

  4. mfc学习---文档视图架构

    MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI).   一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1. ...

  5. 手机调取摄像头问题(getUserMedia)

    先说坏消息,苹果机没法玩这个!!! 而且,必须拥有 https 的安全协议!!! 而安卓机想完成这个功能倒是很 easy 的,看一眼代码 主要传入三个参数,配置对象,成功,失败 var mediaOp ...

  6. c# 布局(stackpanel)

    <Grid> <StackPanel> <Button Content="asas"> </Button> <Button C ...

  7. Java多线程基础知识总结笔记

    本篇笔记记录一些在Java多线程编程中常见的关键字,比较简单和基础的就不写太详细了. 一.Thread类(其实也是应用了Runnable接口)和Runnable接口(只有一个run方法,应用该类必须重 ...

  8. 最牛技术 1秒启动Linux的窍门

    1秒启动Linux可以实现吗?我们知道Linux系统开机并不算快,最少也需要11秒,但是,现在有一个技巧,可以1秒打开linux系统,到底是什么技术这么牛?请看下文详细介绍 尽可能快的启动系统,对于自 ...

  9. 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时

    经查应用程序池中, 有一个启用32位应用程序,  有时打开它就能连接上SQL SERVER了.

  10. kafka入门使用

    kafka版本0.11.0.1以上自带zookeeper,必须要求环境中有jdk,解压后进入目录 1.在kafka解压目录下下有一个config的文件夹,里面放置的是我们的配置文件 consumer. ...