rest_framework 访问频率(节流)流程
访问频率流程
访问频率流程与认证流程非常相似,只是后续操作稍有不同
当用发出请求时 首先执行dispatch函数,当执行当第二部时:
#2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制
self.initial(request, *args, **kwargs)
进入到initial方法:
def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""
self.format_kwarg = self.get_format_suffix(**kwargs) # Perform content negotiation and store the accepted info on the request
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg # Determine the API version, if versioning is in use.
#2.1处理版本信息
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme # Ensure that the incoming request is permitted
#2.2处理认证信息
self.perform_authentication(request)
#2.3处理权限信息
self.check_permissions(request)
#2.4对用户的访问频率进行限制
self.check_throttles(request)
#2.4对用户的访问频率进行限制
self.check_throttles(request)
下面 开始 限流的具体分析:
一、执行check_throttles方法
def check_throttles(self, request):
"""
Check if request should be throttled.
Raises an appropriate exception if the request is throttled.
"""
#遍历throttle对象列表
for throttle in self.get_throttles():
#根据allow_request()的返回值进行下一步操作,返回True的话不执行下面代码,标识不限流,返回False的话执行下面代码,还可以抛出异常
if not throttle.allow_request(request, self):
#返回False的话执行
self.throttled(request, throttle.wait())
局部访问频率
throttles.py
#局部访问频率
from rest_framework.throttling import BaseThrottle
import time
class VisitThorttles(object):
visit_thorttles={}
def __init__(self):
self.history=None def allow_request(self,request,view):
current_time=time.time()
# 访问用户的IP
visit_ip=request.META.get("REMOTE_ADDR")
# 第1 次访问时
if visit_ip not in self.visit_thorttles:
self.visit_thorttles[visit_ip]=[current_time] return True
self.history = self.visit_thorttles[visit_ip] # 第2、3次访问 默认单位时间只能访问3次,
if len(self.visit_thorttles[visit_ip])<3:
# 最新访问时间放在列表第一个
self.visit_thorttles[visit_ip].insert(0,current_time)
return True # # 判断当前时间与用户最早访问时间(列表对三个时间)的差值
if current_time-self.visit_thorttles[visit_ip][-1]>60:
self.visit_thorttles[visit_ip].pop()
self.visit_thorttles[visit_ip].insert(0,current_time)
return True return False
view.py
class BookViewsSet(viewsets.ModelViewSet): # 访问频率
throttle_classes=[VisitThorttles] queryset = Book.objects.all()
serializer_class = BookModelSerializer
全局访问频率
throttles.py
#局部访问频率
from rest_framework.throttling import BaseThrottle
import time
class VisitThorttles(object):
visit_thorttles={}
def __init__(self):
self.history=None def allow_request(self,request,view):
current_time=time.time()
# 访问用户的IP
visit_ip=request.META.get("REMOTE_ADDR")
# 第1 次访问时
if visit_ip not in self.visit_thorttles:
self.visit_thorttles[visit_ip]=[current_time] return True
self.history = self.visit_thorttles[visit_ip] # 第2、3次访问 默认单位时间只能访问3次,
if len(self.visit_thorttles[visit_ip])<3:
# 最新访问时间放在列表第一个
self.visit_thorttles[visit_ip].insert(0,current_time)
return True # # 判断当前时间与用户最早访问时间(列表对三个时间)的差值
if current_time-self.visit_thorttles[visit_ip][-1]>60:
self.visit_thorttles[visit_ip].pop()
self.visit_thorttles[visit_ip].insert(0,current_time)
return True return False
settings.py
REST_FRAMEWORK={
"DEFAULT_THROTTLE_CLASSES":["api.servise.throttles.VisitThorttles"],
}
内置访问频率
htorttles.py
# 内置的htorttles:
from rest_framework.throttling import SimpleRateThrottle class VisitThorttles(SimpleRateThrottle):
# 范围 visit_rate可自定义,与settings相匹配
scope = "visit_rate"
def get_cache_key(self, request, view): return self.get_ident(request)
settings.py
REST_FRAMEWORK = { "DEFAULT_THROTTLE_RATES":{
'tiga':'10/m',
'anno':'5/m',
'user':'10/m',
'admin':'20/m',
}
}
待续
rest_framework 访问频率(节流)流程的更多相关文章
- rest_framework 节流功能(访问频率)
访问记录 = { 身份证号: [ :: ,::, ::] } #:: ,::,:: ,::, #:: #[::, ::, ::] #访问记录 = { 用户IP: [...] } import time ...
- django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...
- rest_framework组件之认证,权限,访问频率
共用的models from django.db import models # Create your models here. class User(models.Model): username ...
- Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
一.一个请求来到Django 的生命周期 FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...
- RestFramework自定制之认证和权限、限制访问频率
认证和权限 所谓认证就是检测用户登陆与否,通常与权限对应使用.网站中都是通过用户登录后由该用户相应的角色认证以给予对应的权限. 权限是对用户对网站进行操作的限制,只有在拥有相应权限时才可对网站中某个功 ...
- rest_framework之频率详解 03
访问频率(节流) 1.某个用户一分钟之内访问的次数不能超过3次,超过3次则不能访问了,需要等待,过段时间才能再访问. 2.自定义访问频率.两个方法都必须写上. 登入页面的视图加上访问频率 3.返回值F ...
- 「Django」rest_framework学习系列-节流控制
1.节流自定义类: import time from api import models VISIT_RECORD = {} class VisitThrottle(BaseThrottle): #设 ...
- Django rest_framework 认证源码流程
一.请求到来后,都要先执行dispatch方法 dispatch根据请求方式的不同触发get/post/put/delete等方法 注意,APIView中的dispatch方法有很多的功能 def d ...
- Django Rest Framework用户访问频率限制
一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...
随机推荐
- Spring温故而知新 – bean的装配
Spring装配机制 Spring提供了三种主要的装配机制: 1:通过XML进行显示配置 2:通过Java代码显示配置 3:自动化装配 自动化装配 Spring中IOC容器分两个步骤来完成自动化装配: ...
- 结对作业 -GUI四则运算
目录: 一.前言(及项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模块 ...
- PokeCats开发者日志(八)
现在是PokeCats游戏开发的第十四天的中午,很不幸著作权申请又被打回来了. 据说是排版后代码行数还差500行,文档不足十版.我擦,原来他们会自己排版的啊. 只好从项目自带的xml里扣代 ...
- B树(B-树)
1.基本概念: M定义为树的高度,也叫阶,就是树的深度: (1).B树又称为多路平衡查找树. (2).根节点至少有两个子节点. (3).除根节点以外的非叶子节点的儿子树为[M/2,M]. (4).每个 ...
- systemPath
<dependency> <groupId>com.aliyun.mns</groupId> <artifactId>aliyun-sdk-mn ...
- IE6,7,8支持css圆角
我们知道Webkit内核的浏览器支持-webkit-border-radius: 10px;属性(10px是圆角半径),可以直接解析出圆角;Firefox浏览器支持-moz-border-radius ...
- [UVA1625]Color Length
题面在这里 description 输入两个长度分别为\(n\)和\(m\)的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部. 对于每个颜色\(c\)来说,其跨度 ...
- 洛谷 P1251 餐巾计划问题
题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...
- [Leetcode] 3sum 三数和
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D
D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes input st ...