访问频率流程

访问频率流程与认证流程非常相似,只是后续操作稍有不同

当用发出请求时 首先执行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 访问频率(节流)流程的更多相关文章

  1. rest_framework 节流功能(访问频率)

    访问记录 = { 身份证号: [ :: ,::, ::] } #:: ,::,:: ,::, #:: #[::, ::, ::] #访问记录 = { 用户IP: [...] } import time ...

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

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

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

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

  4. Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析

    一.一个请求来到Django 的生命周期   FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...

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

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

  6. rest_framework之频率详解 03

    访问频率(节流) 1.某个用户一分钟之内访问的次数不能超过3次,超过3次则不能访问了,需要等待,过段时间才能再访问. 2.自定义访问频率.两个方法都必须写上. 登入页面的视图加上访问频率 3.返回值F ...

  7. 「Django」rest_framework学习系列-节流控制

    1.节流自定义类: import time from api import models VISIT_RECORD = {} class VisitThrottle(BaseThrottle): #设 ...

  8. Django rest_framework 认证源码流程

    一.请求到来后,都要先执行dispatch方法 dispatch根据请求方式的不同触发get/post/put/delete等方法 注意,APIView中的dispatch方法有很多的功能 def d ...

  9. Django Rest Framework用户访问频率限制

    一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...

随机推荐

  1. 修改maven远程仓库为阿里的maven仓库(复制)

    maven之一:maven安装和eclipse集成 maven作为一个项目构建工具,在开发的过程中很受欢迎,可以帮助管理项目中的bao依赖问题,另外它的很多功能都极大的减少了开发的难度,下面来介绍ma ...

  2. 剑指offer:从头到尾打印链表

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...

  3. java--List转换成json格式

    方法一 首先导入jar包,json-rpc-1.0.jar public class List2Json { public static JSONArray ProLogList2Json(List& ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)-第二篇

    项目冲刺——第二阶段 度过了敏捷冲刺,各个成员积极汇报各自的工作.好了,着手下一步规划! Mission 团队成员 任务 郭达  实现PHP后台的答题判分查看正确率 刘德培  编写博客 石浩洋  实现 ...

  5. onkeypress,onkeyup,onkeydown区别

    onkeypress 这个事件在用户按下并放开任何字母数字键时发生.系统按钮(例如,箭头键和功能键)无法得到识别. onkeyup 这个事件在用户放开任何先前按下的键盘键时发生. onkeydown ...

  6. PokeCats开发者日志(三)

      现在是PokeCats游戏开发的第四天的晚上,明天要过周末了,所以提前写一下开发者日志吧! day4   day4主要是优化界面和增加游戏可玩性.   (1)感觉只有三只喵喵的话,玩家只需要无脑点 ...

  7. 【Python】- 如何使用Visual Studio 2013编写python?

    安装Visual Studio 2013 1.VS2013下载安装略 安装python2.7 1.从官网下载python2.7,下载地址:https://www.python.org/getit/  ...

  8. C#的23种设计模式概括

    创建型:         1. 单件模式(Singleton Pattern)         2. 抽象工厂(Abstract Factory)         3. 建造者模式(Builder) ...

  9. LeetCode--Reverse Linked List(Java)

    相似题目: Palindrome Number Valid PalinDrome Reverse Linked List Palindrome Linked List 翻转单链表(要注意的是是否含有头 ...

  10. SRM709 div1 Xscoregame(状压dp)

    题目大意: 给定一个序列a,包含n个数(n<=15),每个数的大小小于等于50 初始时x = 0,让你每次选a中的一个数y,使得x = x + x^y 问如何安排选择的次序,使得最终结果最大. ...