访问记录 = {
身份证号: [ :: ,::, ::]
}
#:: ,::,:: ,::, #::
#[::, ::, ::] #访问记录 = {
用户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 节流功能(访问频率)的更多相关文章

  1. rest_framework 访问频率(节流)流程

    访问频率流程 访问频率流程与认证流程非常相似,只是后续操作稍有不同 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进 ...

  2. rest_framework组件之认证,权限,访问频率

    共用的models from django.db import models # Create your models here. class User(models.Model): username ...

  3. RestFramework自定制之认证和权限、限制访问频率

    认证和权限 所谓认证就是检测用户登陆与否,通常与权限对应使用.网站中都是通过用户登录后由该用户相应的角色认证以给予对应的权限. 权限是对用户对网站进行操作的限制,只有在拥有相应权限时才可对网站中某个功 ...

  4. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

  5. 从FBV到CBV四(访问频率限制)

    比如我们有一个用户大转盘抽奖的功能,需要规定用户在一个小时内只能抽奖3次,那此时对接口的访问频率限制就显得尤为重要 其实在restframework中已经为我们提供了频率限制的组件 先捋一下请求到AP ...

  6. DRF框架之 用户角色权限与访问频率的权限设置

    1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...

  7. cache 访问频率的思考

    互联网的项目用户基数很大,有时候瞬间并发量非常大,这个时候对于数据访问来说是个灾难.为了应对这种场景,一般都会大量采用web服务器集群,缓存集群.采用集群后基本上就能解决大量并发的数据访问.当然这个时 ...

  8. django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析

    url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...

  9. Redis 实现接口访问频率限制

    为什么限制访问频率 做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次 主要用来保证服务性能和保护数据安全 因为如果不进行限制,服务调用者可 ...

随机推荐

  1. Chrome的JSON View插件

    Chrome的JSON View插件 学习了:http://www.cnplugins.com/zhuanti/five-chrome-json-plugins.html 下载了:http://www ...

  2. 小贝_mysql三种子查询

    mysql三种子查询 简要: 一.三种子查询 二.三种子查询理解模型 一.mysql 三种子查询 where子查询.from子查询.exists子查询 二.理解模型: 2.1.一个好的模型,便于我们去 ...

  3. oracle 时间戳TIMESTAMP

    //数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...

  4. 智课雅思词汇---十二、vent是什么意思

    智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...

  5. m_Orchestrate learning system---六、善用组件插件的好处是什么

    m_Orchestrate learning system---六.善用组件插件的好处是什么 一.总结 一句话总结: 1.面包屑导航是什么? 知道它是什么自然就知道它怎么用了 2.表格里面的栏目能能点 ...

  6. ORA-01950: 表空间'USERS'中无权限的2种解决办法

    在创建了一个新的表空间和一个新的用户,当用这个新用户创建表时, 却出现:ORA-01950: 表空 间'USERS'中无权限.   我已经把创建表的权限赋给了此用户,怎么还会缺少权限呢?解决办法   ...

  7. ASP页面的执行顺序

    http://hi.baidu.com/yanjiezhu/item/29c113c3912e2a0ac710b2d3 1.对象初始化(OnInit方法) 页面中的控件(包括页面本身)都是在它们最初的 ...

  8. 初识Git(二)

    与我们前一篇随笔一样创建文件夹,init我们创建的文件夹,并且创建一个test.txt文本文件,add文本文件,commit文本文件,接下来在文本文件中添加文本: 与上一次不同的是我们这一次在编辑文件 ...

  9. Dispatch Groups

    Dispatch Groups are objects that allow several tasks to be grouped for later joining. Tasks can be a ...

  10. Converting Legacy Chrome IPC To Mojo

    Converting Legacy Chrome IPC To Mojo Looking for Mojo Documentation? Contents Overview Deciding What ...