rest_framework 节流功能(访问频率)
访问记录 = {
身份证号: [ :: ,::, ::]
}
#:: ,::,:: ,::,
#::
#[::, ::, ::]
#访问记录 = {
用户IP: [...]
}
import time
VISIT_RECORD = {} #存放IP的数据库 可以放在缓存!
from rest_framework.thrittling import BaseThrottle
class VisitThrattle(object):
def __init__(self):
self.history = None
def allow_request(self, request, view):
"""
写一些业务逻辑
获取用户IP地址
60s内只能访问3次
"""
remote_addr = request._request.META.get('REMOTE_ADDR')
print(remote_addr) #访问记录IP
ctime = time.time()
if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime,] #表示第一次访问
return True
history = VISIT_RECORD.get(remote_addr)
self.history = history
while history and history[[-] < ctime -:
history.pop()
if len(history) < :
history.insert(, ctime)
return True
return False
return True #判断是否可以继续访问 True可以访问 频率没有达到最大
#return False如果返回False频率太高,已经被限制 无法继续下一步访问
def wait(self):
#显示还需要等多少秒
ctime = time.time()
return = - (ctime - self.history[-])
class AuthView(APIView):
authentication_calsses = []
permission_classes = []
throttle_classes = [VisitThrattle,]
def post(self, request, *args, **kwargs):
#去 request获取IP
#访问记录
全局配置的话
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES" : ['api.utlis.throttle.VisitThrottle']
}
内置控制频率的类:
BaseThrottle SimpleRateThrottle(BaseThrottle) allow_request
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle): #对匿名用户的ip号通过时间做访问频率控制
scope = 'Luffy' #指定setting配置文件中Luffy(key)
def get_cache_key(self, request, view): #去缓存里取数据
return self.get_ident(request)
class UserThrottle(SimpleRateThrottle): #对用户的名字 通过时间做访问频率控制
scope = "LuffyUser"
def get_cache_key(self, request, view):
return request.user.username
然后再views.py添加
from api.utils.throttle import UserThrottle
在创建的函数里添加
throttle_classes = ["UserThrottle"]
在setting.py加
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['api.utils.throttle.VisitThrottle'],
"DEFAULT_THROTTLE_RATES":{
"Luffy":'3/m' #每分钟访问3次 #duration = {'s':, 'm':, 'h':, 'd':}[period[]]
"LuffyUser": /m
}
}
梳理:
a. 基本使用
-类, 继承BaseThrottle 实现 allow_request wait 两个方法 加个__init__构造函数
-类, 继承SimpleRateThrottle 实现 get_cache_key scope = "Luffy" (配置文件中的key)
b. 局部使用
class AuthView(APIView):
throttle_classes = [ VisitThrottle, ] #>>>>>>
全局
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['api.utils.throttle.VisitThrottle'],
"DEFAULT_THROTTLE_RATES":{
"Luffy":'3/m' #每分钟访问3次 #duration = {'s':, 'm':, 'h':, 'd':}[period[]]
"LuffyUser": /m
}
}
rest_framework 节流功能(访问频率)的更多相关文章
- rest_framework 访问频率(节流)流程
访问频率流程 访问频率流程与认证流程非常相似,只是后续操作稍有不同 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进 ...
- rest_framework组件之认证,权限,访问频率
共用的models from django.db import models # Create your models here. class User(models.Model): username ...
- RestFramework自定制之认证和权限、限制访问频率
认证和权限 所谓认证就是检测用户登陆与否,通常与权限对应使用.网站中都是通过用户登录后由该用户相应的角色认证以给予对应的权限. 权限是对用户对网站进行操作的限制,只有在拥有相应权限时才可对网站中某个功 ...
- Django REST framework 自定义(认证、权限、访问频率)组件
本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...
- 从FBV到CBV四(访问频率限制)
比如我们有一个用户大转盘抽奖的功能,需要规定用户在一个小时内只能抽奖3次,那此时对接口的访问频率限制就显得尤为重要 其实在restframework中已经为我们提供了频率限制的组件 先捋一下请求到AP ...
- DRF框架之 用户角色权限与访问频率的权限设置
1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...
- cache 访问频率的思考
互联网的项目用户基数很大,有时候瞬间并发量非常大,这个时候对于数据访问来说是个灾难.为了应对这种场景,一般都会大量采用web服务器集群,缓存集群.采用集群后基本上就能解决大量并发的数据访问.当然这个时 ...
- django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...
- Redis 实现接口访问频率限制
为什么限制访问频率 做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次 主要用来保证服务性能和保护数据安全 因为如果不进行限制,服务调用者可 ...
随机推荐
- jquery让 readOnly失效的方法
re.attr("readOnly","true"); re.attr("readOnly",false); 注意 :false不能带引号
- HDU 4313 Contest 2
很明显的树形DP了.但网上有的说可以用并查集.... 考虑一棵子树,当根结点有机器人时,则必定所有子树都要和根结点断开,而根结点向上返回的路径值则为其父结点与根结点连边的权值. 当根结点安全时,假设其 ...
- Win10使用VMware虚拟机安装ubuntu
Win10专业版自带有虚拟机安装工具Hyper-V,也可以使用其他如VMware工具安装,也挺方便. 所需工具: 1. VMware-workstation 下载链接: http://rj.bai ...
- oracle rac 巡检过程详解
一 RAC环境 RAC架构,2节点信息 节点1 SQL> show parameter instance NAME TYPE ...
- 手动配置IP网络
1. #vi /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 是网卡的名字,根据自己的计算机 2. 修改配置 ONBOOT=no改为ONB ...
- 使用wpa_supplicant连接WIFI
让树莓派可以开机就连接制定的wifi, 可以通过wpa_supplicant来实现. 在 /etc/wpa_supplicant 下写一个配置文件: wpa_supplicant.conf 内容如下: ...
- 查看typedef类型
typedef unsigned long int NUM; #include <iostream> using namespace std; NUM x; cout << t ...
- 根据ip地址获取城市
var ip=context.Request.UserHostAddress; string url = "http://int.dpool.sina.com.cn/iplookup/ipl ...
- 「JavaSE 重新出发」02.01 基本数据类型
基本数据类型 1. 整型 注意:Java 没有任何无符号(unsigned)形式的 int.long.short 或 byte 类型. 不同进制的表示形式: 十六进制数值有一个前缀0x或0X(如0xC ...
- atom安装插件失败 latex
用atom写latex 链接 http://www.cnblogs.com/schaepher/p/5934184.html 但在gui下安装插件失败 按照以下步骤解决了 安装gitbash cd . ...