访问频率流程

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

当用发出请求时 首先执行dispatch函数,当执行当第二部时:

  1. #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制
  2. self.initial(request, *args, **kwargs)

进入到initial方法:

  1. def initial(self, request, *args, **kwargs):
  2. """
  3. Runs anything that needs to occur prior to calling the method handler.
  4. """
  5. self.format_kwarg = self.get_format_suffix(**kwargs)
  6.  
  7. # Perform content negotiation and store the accepted info on the request
  8. neg = self.perform_content_negotiation(request)
  9. request.accepted_renderer, request.accepted_media_type = neg
  10.  
  11. # Determine the API version, if versioning is in use.
  12. #2.1处理版本信息
  13. version, scheme = self.determine_version(request, *args, **kwargs)
  14. request.version, request.versioning_scheme = version, scheme
  15.  
  16. # Ensure that the incoming request is permitted
  17. #2.2处理认证信息
  18. self.perform_authentication(request)
  19. #2.3处理权限信息
  20. self.check_permissions(request)
  21. #2.4对用户的访问频率进行限制
  22. self.check_throttles(request)
  1. #2.4对用户的访问频率进行限制
  2. self.check_throttles(request)

下面 开始 限流的具体分析:

一、执行check_throttles方法

  1. def check_throttles(self, request):
  2. """
  3. Check if request should be throttled.
  4. Raises an appropriate exception if the request is throttled.
  5. """
  6. #遍历throttle对象列表
  7. for throttle in self.get_throttles():
  8. #根据allow_request()的返回值进行下一步操作,返回True的话不执行下面代码,标识不限流,返回False的话执行下面代码,还可以抛出异常
  9. if not throttle.allow_request(request, self):
  10. #返回False的话执行
  11. self.throttled(request, throttle.wait())

局部访问频率

throttles.py

  1. #局部访问频率
  2. from rest_framework.throttling import BaseThrottle
  3. import time
  4. class VisitThorttles(object):
  5. visit_thorttles={}
  6. def __init__(self):
  7. self.history=None
  8.  
  9. def allow_request(self,request,view):
  10. current_time=time.time()
  11. # 访问用户的IP
  12. visit_ip=request.META.get("REMOTE_ADDR")
  13. # 第1 次访问时
  14. if visit_ip not in self.visit_thorttles:
  15. self.visit_thorttles[visit_ip]=[current_time]
  16.  
  17. return True
  18. self.history = self.visit_thorttles[visit_ip]
  19.  
  20. # 第2、3次访问 默认单位时间只能访问3次,
  21. if len(self.visit_thorttles[visit_ip])<3:
  22. # 最新访问时间放在列表第一个
  23. self.visit_thorttles[visit_ip].insert(0,current_time)
  24. return True
  25.  
  26. # # 判断当前时间与用户最早访问时间(列表对三个时间)的差值
  27. if current_time-self.visit_thorttles[visit_ip][-1]>60:
  28. self.visit_thorttles[visit_ip].pop()
  29. self.visit_thorttles[visit_ip].insert(0,current_time)
  30. return True
  31.  
  32. return False

view.py

  1. class BookViewsSet(viewsets.ModelViewSet):
  2.  
  3. # 访问频率
  4. throttle_classes=[VisitThorttles]
  5.  
  6. queryset = Book.objects.all()
  7. serializer_class = BookModelSerializer

全局访问频率

throttles.py

  1. #局部访问频率
  2. from rest_framework.throttling import BaseThrottle
  3. import time
  4. class VisitThorttles(object):
  5. visit_thorttles={}
  6. def __init__(self):
  7. self.history=None
  8.  
  9. def allow_request(self,request,view):
  10. current_time=time.time()
  11. # 访问用户的IP
  12. visit_ip=request.META.get("REMOTE_ADDR")
  13. # 第1 次访问时
  14. if visit_ip not in self.visit_thorttles:
  15. self.visit_thorttles[visit_ip]=[current_time]
  16.  
  17. return True
  18. self.history = self.visit_thorttles[visit_ip]
  19.  
  20. # 第2、3次访问 默认单位时间只能访问3次,
  21. if len(self.visit_thorttles[visit_ip])<3:
  22. # 最新访问时间放在列表第一个
  23. self.visit_thorttles[visit_ip].insert(0,current_time)
  24. return True
  25.  
  26. # # 判断当前时间与用户最早访问时间(列表对三个时间)的差值
  27. if current_time-self.visit_thorttles[visit_ip][-1]>60:
  28. self.visit_thorttles[visit_ip].pop()
  29. self.visit_thorttles[visit_ip].insert(0,current_time)
  30. return True
  31.  
  32. return False

settings.py

  1. REST_FRAMEWORK={
  2. "DEFAULT_THROTTLE_CLASSES":["api.servise.throttles.VisitThorttles"],
  3. }

内置访问频率

htorttles.py

  1. # 内置的htorttles:
  2. from rest_framework.throttling import SimpleRateThrottle
  3.  
  4. class VisitThorttles(SimpleRateThrottle):
  5. # 范围 visit_rate可自定义,与settings相匹配
  6. scope = "visit_rate"
  7. def get_cache_key(self, request, view):
  8.  
  9. return self.get_ident(request)

settings.py

  1. REST_FRAMEWORK = {
  2.  
  3. "DEFAULT_THROTTLE_RATES":{
  4. 'tiga':'10/m',
  5. 'anno':'5/m',
  6. 'user':'10/m',
  7. 'admin':'20/m',
  8. }
  9. }

待续

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. 初学者学习python2还是python3?

    如果你是一个初学者,或者你以前接触过其他的编程语言,你可能不知道,在开始学习python的时候都会遇到一个比较让人很头疼的问题:版本问题!!是学习python2 还是学习 python3 ?这是非常让 ...

  2. python中通过string类名获得实例

    原文:https://bytes.com/topic/python/answers/42866-how-create-object-instance-string Ksenia Marasanova的 ...

  3. 【SSH】——Hibernate三种状态之间的转化

    Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...

  4. SSH Secure Shell Client的使用方法

    1:双击其客户端图标,出现下图所示窗体 2:我使用她主要用于发布项目的,所以第一次使用会选择新建一个账户 3:填写账户的名称 4:完善账户的信息 5:主要用填下远程主机的IP/USER/PORT,在需 ...

  5. Cocoa & OS X & swift 4

    Cocoa & OS X & swift 4 http://www.runoob.com/swift/swift-environment.html https://en.wikiped ...

  6. 【bzoj3052】[wc2013]糖果公园 带修改树上莫队

    题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...

  7. 【bzoj1412】[ZJOI2009]狼和羊的故事 网络流最小割

    题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...

  8. BZOJ4602 SDOI2016齿轮(搜索)

    dfs一遍给每个齿轮随便标个值看是否矛盾就行了. #include<iostream> #include<cstdio> #include<cmath> #incl ...

  9. 在iis上部署ssl证书 https

    1.取走证书下载下来的文件.解压iis的压缩包. 2.打开internet信息服务iis管理器 3.双击打开后,选择导入,导入我们刚刚解压得到的pfx文件,这个pfx文件就是你需要部署域名的那个文件. ...

  10. javascript 随机数区间

    生成[0,max]之间的随机数 parseInt(Math.random()*(max+1),10);Math.floor(Math.random()*(max+1)); 生成[1,max]之间的随机 ...