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 ...
随机推荐
- sql between and 边界问题
1.不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的.需要自己测试 2.一般情况下.SQL Server中 between and是包括边界值的,not between不包括边界 ...
- DataView RowFilter Syntax [C#]
RowFilter语法 private void btnEnquiry_Click(object sender, EventArgs e) { string filterExpression = st ...
- Spark分布式执行原理
Spark分布式执行原理 让代码分布式运行是所有分布式计算框架需要解决的最基本的问题. Spark是大数据领域中相当火热的计算框架,在大数据分析领域有一统江湖的趋势,网上对于Spark源码分析的文章有 ...
- 大步小步算法模板题, poj2417
大步小步模板 (hash稍微有一点麻烦, poj不支持C++11略坑) #include <iostream> #include <vector> #include <c ...
- Tomcat-Jdbc-Pool连接池参数说明
原文 http://liuxing.info/2016/01/05/Tomcat-Jdbc-Pool参数说明/ 转载收藏用,如有侵权,请联系删除,谢谢. 介绍 Tomcat 在 7.0 以前的版本都 ...
- VK Cup 2016 - Round 1 (Div. 2 Edition) A Bear and Reverse Radewoosh
A. Bear and Reverse Radewoosh time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- rest与restful
知乎上面摘抄的,感觉不错,分享下: https://www.zhihu.com/question/28557115 1. REST描述的是在网络中client和server的一种交互形式:RES ...
- Google MapReduce中文版
英文原文链接: Google Map Reduce 译文原文链接: Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程 ...
- VC遍历窗体控件的实现
最近在写控制台,在设计界面按钮风格时不想通过每个按钮的ID来获取其句柄,而是通过遍历窗体所有控件,然后判断其控件类型进而来实现. 代码如下: // 遍历得到页面中的所有Button控件,依次设定其样式 ...
- 如何解决DuplicateFileException: Duplicate files copied in APK问题
问题:有重复的文件存在APK里 解决方案:在Module里的build.gradle中设置忽略此重复文件即可.