pythondjango图解(详解Django-restframework 之频率源码分析)
类别:脚本大全 浏览量:1625
时间:2022-01-19 00:39:19 pythondjango图解
详解Django-restframework 之频率源码分析一 前言
经过权限判断之后就是进行频率的判断了,而频率的判断和权限又不一样,认证、权限和频率的执行流程都差不多,使用配置里面的相关类来进行判断。而不和认证和权限一样,频率的配置没有,查看 apiview
的类属性如下:
二 频率组件执行流程
虽然 restframework
原生灭有配置频率,但是提供了几个进行频率判断的类,如下:
其中 simpleratethrottle
类是根据访问者 ip 来进行频率限制的一个类,来看看这个类的执行流程。
1. init方法
2. get_rate
3. 执行 allow_request方法
4. get_cache_key
5. 时间差判断
6. throttle_success
认证失败的话执行 throttle_failure
,其实就是返回 false
。
7. wait
三 自定义频率组件
1. 自定义频率类
频率类需要继承自带的频率类
|
# from rest_framework.throttling import basethrottle class bookthrottle(basethrottle): visit_record = {} def __init__( self ): self .history = none def allow_request( self , request, view): print (request.meta) remote_addr = request.meta.get( 'remote_addr' ) import time ctime = time.time() if remote_addr not in self .visit_record: self .visit_record[remote_addr] = [ctime,] return true self .history = self .visit_record.get(remote_addr) while self .history and ctime - self .history[ - 1 ] > 60 : self .history.pop() if len ( self .history) < 3 : self .history.insert( 0 , ctime) return true else : return false def wait( self ): import time ctime = time.time() return 60 - (ctime - self .history[ - 1 ]) |
|
# 频率类代码注释 # 访问频率的逻辑 # # {'ip地址':[16:13:39,16:13:19,],'ip地址2':[时间1,时间2],} # # (1)取出访问者ip # # (2)判断当前ip不在访问字典里,添加进去,并且直接返回true,表示第一次访问,在字典里,继续往下走 # # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, # # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回true,顺利通过 # # (5)当大于等于3,说明一分钟内访问超过三次,返回false验证失败 # #(1)取出访问者ip # # print(request.meta) # # remote_addr 就是访问者的ip:127.0.0.1 # ip=request.meta.get('remote_addr') # import time # # 获取当前时间 # ctime=time.time() # # (2)判断当前ip不在访问字典里,添加进去,并且直接返回true,表示第一次访问 # if ip not in self.visit_record: # self.visit_record[ip]=[ctime,] # # {'127.0.0.1':[时间1,时间1,]} # return true # # self.history=[时间1,时间1,] # self.history=self.visit_record.get(ip) # # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, # while self.history and ctime-self.history[-1]>60: # self.history.pop() # # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回true,顺利通过 # # (5)当大于等于3,说明一分钟内访问超过三次,返回false验证失败 # if len(self.history)<3: # self.history.insert(0,ctime) # return true # else: # return false |
2. 使用
使用很简单,在需要进行频率控制的视图类中定义一个属性 throttle_classes
,如下:
|
class book(apiview): authentication_classes = [authticate_classes.bookauth] permission_classes = [permiss_classes.loginpermission] throttle_classes = [thrott_classes.bookthrottle] # authentication_classes = [] def dispatch( self , request, * args, * * kwargs): return super ().dispatch(request, * args, * * kwargs) def get( self , request, id ): print (request.user, '444' ) response = { 'status' : 100 , 'msg' : none} book_obj = models.book.objects. filter (pk = id ).first() if book_obj: book_ser = myser.bookser(book_obj, many = false) response[ 'book' ] = book_ser.data else : response[ 'msg' ] = '图书没有对象' response[ 'status' ] = 101 return response(response) |
四 配置自定义频率类
1. 局部配置
其实上面的就是局部配置,
|
class book(apiview): authentication_classes = [authticate_classes.bookauth] permission_classes = [permiss_classes.loginpermission] throttle_classes = [thrott_classes.bookthrottle] |
2. 全局使用
全局配置如下:
|
rest_framework = { 'default_throttle_classes' : [ 'app01.thrott_classes.bookthrottle' ] } |
3. 局部禁用
局部禁用需要在视图类中定义一个空的 throttle_classes
属性
|
throttle_classes = [] |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:http://www.cnblogs.com/zuanzuan/p/10439590.html
您可能感兴趣
- django后台运行命令(Django框架实现的普通登录案例使用POST方法)
- django学生管理系统搭建(Django实现学员管理系统)
- django模板自定义(详解Django项目中模板标签及模板的继承与引用网站中快速布置广告)
- pycharm怎么创建django项目(Python、 Pycharm、Django安装详细教程图文)
- django框架基础之路由详解(详解Django中CBVClass Base Views模型源码分析)
- pythondjango工作机制(Python后台开发Django会话控制的实现)
- django中的limit用法(如何在Django中添加没有微秒的 DateTimeField 属性详解)
- django常用模块(django celery redis使用具体实践)
- django框架运行流程(Django+Xadmin构建项目的方法步骤)
- django整合前端流程日志权限(使用Django开发简单接口实现文章增删改查)
- django实现登录注册(django与小程序实现登录验证功能的示例代码)
- django登录模块(Django实现单用户登录的方法示例)
- django怎么创建模板文件(django模板加载静态文件的方法步骤)
- django表单提交到数据库(Django 表单模型选择框如何使用分组)
- django开发平台运用的技术(django的ORM模型的实现原理)
- pythondjango图解(详解Django-restframework 之频率源码分析)
- 高中数学题(高中数学题型总结及解题方法)
- 冰岛旅游攻略(冰岛旅游攻略及花费)
- 为什么现在年轻人越来越喜欢买衣服(为什么现在年轻人越来越喜欢买衣服穿)
- 怎么做好SEO(怎么做好seo内容优化)
- 冬季钓鱼子线用 长 还是 短(冬季钓鱼子线用)
- 鱼竿 夏钓短,冬钓长 ,一定是这样 认清优缺点在选竿(鱼竿夏钓短冬钓长)
热门推荐
- sqlserver索引策略(SQLServer性能优化--间接实现函数索引或者Hash索引)
- mysql怎么设置存储记录(MySQL 的一行记录是怎么存储的?)
- sql server查询语句语法(详解SQL Server的简单查询语句)
- docker容器的标准使用过程(Docker容器的使用方法简单示例)
- 微信小程序scrollview 截图(微信小程序scroll-view不能左右滑动问题的解决方法)
- 云服务器性能怎么判断(怎么判断云服务器适合自己的企业呢?)
- sql server数据库备份计划(SQL Server数据库设置自动备份策略的完整步骤)
- 执行mysqldump命令后数据库无反应(关于xampp启动不了mysql数据库的解决方法)
- pythondict排序原理(Python标准库使用OrderedDict类的实例讲解)
- docker 命令上传镜像到镜像仓库(Docker 制作镜像Dockerfile和commit操作)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9