第一版:

  1. from rest_framework
    class VisitThrottle(object):
  2. def __init__(self):
  3. self.history = None
  4.  
  5. def allow_request(self,request,view):
  6. #获取用户IP
  7. #remote_addr = request.META.get('REMOTE_ADDR')
          remote_addr = self.get_ident(request)
    ctime = time.time()
  8. if remote_addr not in VISIT_RECORD:
  9. VISIT_RECORD[remote_addr] = [ctime,]
  10. return True
  11. history = VISIT_RECORD.get(remote_addr)
  12. self.history = history
  13. while history and history[-1] < ctime - 10: #限制10秒内访问3次
  14. history.pop()
  15. if length(history) < 3:
  16. history.insert(0,ctime)
  17. return True #return False 表示访问频率过高 限制访问
  18.  
  19. def wait(self): #等待多少秒 才能继续访问
  20. ctime = time.time()
  21. return 60 - (ctime - self.history[-1])
  22.  
  23. class OrderView(APIView):
  24. """
  25. 订单业务
  26. """
  27.  
  28. authentication_classes = []
  29. permission_classes = []
  30. throttle_classes = [VisitThrottle,]
  31. def get(self, request, *args, **kwargs):
  32.  
  33. ret = {'code': 1000, 'msg': None, 'data': None}
  34. try:
  35. ret['data'] = ORDER_DICT
  36. except Exception as e:
  37. pass
  38. return JsonResponse(ret)

  

全局配置:

  1. "DEFAULT_THROTTLE_CLASSES": ["api.utils.throttle.UserThrottle"],
  2. "DEFAULT_THROTTLE_RATES": {
  3. "keyword": '3/m', #限制1分钟内访问3次
  4. "keyword2": '10/m', #限制1分钟内访问10次
  5. },

  

第二版:

  1. from rest_framework.throttle import SimpleRateThrottle
  2.  
  3. class VisitThrottle(SimpleRateThrottle):
  4. scope = "keyword"
  5.  
  6. def get_cache_key(self, request, view):
  7. return self.get_ident(request)
  8.  
  9. class UserThrottle(SimpleRateThrottle):
  10. scope = "keyword2"
  11.  
  12. def get_cache_key(self, request, view):
  13. return request.user.username
    #scope 传递参数给 settings里面的做限制参数使用
  1. "DEFAULT_THROTTLE_RATES": {
  2. "keyword": '3/m', #限制1分钟内访问3次
  3. "keyword2": '10/m', #限制1分钟内访问10次
  4. },

  

第一版:

- 必须继承 BaseThrottle

- 必须实现 allow_request 和wait 方法

第二版:

- 必须继承 SimpleRateThrottle

- 必须实现 get_cache_key方法 传递参数 scope = “userkey”

- 在settings中 写入限制参数  "userkey": '10/m', #限制1分钟内访问10次

Django rest-framework框架-访问频率控制的更多相关文章

  1. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  2. Django REST framework框架介绍和基本使用

    Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...

  3. Django Rest Framework框架 ---- url控制器

    Django Rest Framework框架 ---- url控制器

  4. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

  5. web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍

    web前端Vue+Django rest framework 框架 生鲜电商项目实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...

  6. Django Rest framework 框架

    一.开发模式: 1. 普通开发方式(前后端放在一起写) 2. 前后端分离(前后台通过ajaxo交互) 后端(django rest framework写的) <----ajaxo---> ...

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

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

  8. Django rest framework 限制访问频率(源码分析)

    基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...

  9. Django rest framework框架中有哪些组件

    认证 权限(授权) 用户访问次数/频率限制 版本 解析器(parser) 序列化 分页 路由系统 视图 渲染器 认证 自定义认证的类 """ from rest_fram ...

随机推荐

  1. 安装windows下安装mysql

    参考文档:https://www.cnblogs.com/reyinever/p/8551977.html  https://www.jb51.net/article/151213.htm 首先下载m ...

  2. 执行git pull时提示Connection reset by 13.229.188.59 port 22

    问题如下图: 解决办法: 1. 2. 3. 4. 5. 6.

  3. kotlin中对象表达式

    在kotlin中,也有类似的功能,但不是匿名类,而是对象,需要使用object关键字,对象要继承的列需要与object之间的冒号(:)分隔. fun main(arg: Array<String ...

  4. Java静态方法和实例方法区别详解

    静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...

  5. Unit Testing, Integration Testing and Functional Testing

    转载自:https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional- ...

  6. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  7. jackson 实体转json 为NULL或者为空不参加序列化【转载】

    原博客:https://www.cnblogs.com/yangy608/p/3936848.html 1.实体上 /** * 将该标记放在属性上,如果该属性为NULL则不参与序列化 * 如果放在类上 ...

  8. Elasticsearch 追加更新

    追加更新,学名不知道叫啥,我这里指在历史数据的基础上,追加数据更新.比如 价格数据,我在价格字段里面保存了一个每天价格的数组,追加更新的时候在数组的后面直接add,而不是像一般情况那样覆盖. ES追加 ...

  9. 【VS开发】CString 转为 char *方法大全

    [VS开发]CString 转为 char *方法大全 标签(空格分隔): [VS开发] 方法1: CString strTemp; char szTemp[128]; strTemp = _T(&q ...

  10. iostream

    cout 星号*为默认 控制符 描 述 控制符 描 述 *dec 以十进制形式输出整数 hex 以十六进制形式输出整数 oct 以八进制形式输出整数 fixed 以普通小数形式输出浮点数 scient ...