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
您可能感兴趣
- pycharm怎么创建django项目(Python、 Pycharm、Django安装详细教程图文)
- django框架教程学习(使用Django简单编写一个XSS平台的方法步骤)
- django怎么设置数据库(django配置连接数据库及原生sql语句的使用方法)
- django操作默认数据库(Django数据库类库MySQLdb使用详解)
- django url配置失效(解决Django生产环境无法加载静态文件问题的解决)
- djangoapi接口开发(Django使用AJAX调用自己写的API接口的方法)
- pythondjango图解(详解Django-restframework 之频率源码分析)
- django admin 开发实例(Django给admin添加Action的步骤详解)
- django中的limit用法(如何在Django中添加没有微秒的 DateTimeField 属性详解)
- django自定义后台界面(Django csrf 两种方法设置form的实例)
- pythondjango工作机制(Python后台开发Django会话控制的实现)
- django开发平台运用的技术(django的ORM模型的实现原理)
- django用户权限管理(Django 内置权限扩展案例详解)
- django 页面传参数(django query模块)
- pythonimage库(Python/Django后端使用PIL Image生成头像缩略图)
- django分页器图(Django框架实现分页显示内容的方法详解)
- 蒜苔和鱿鱼尾巴一起炒,味道特别棒,又脆又嫩,有滋又有味(蒜苔和鱿鱼尾巴一起炒)
- 鱿鱼炒蒜苔不是黑暗料理,这样做清香扑鼻,鲜美脆嫩,开胃又下饭(鱿鱼炒蒜苔不是黑暗料理)
- 蒜苔炒鱿鱼(蒜苔炒鱿鱼)
- 远离 五毛食品 洛阳80后妈妈发明的 飞行棋 成校园爆款 玩具(远离五毛食品)
- 失传的古代飞行棋游戏 六博(失传的古代飞行棋游戏)
- 感冒要吃什么药(猫咪感冒要吃什么药)
热门推荐
- laravel关联模型新增数据(使用laravel的migrate创建数据表的方法)
- 云服务器被攻击了怎么解决(租用云服务器要怎么来预防网络攻击?)
- linux中用户管理命令(Linux usermod 命令的使用)
- mysql主从复制配置(Mysql实现主从配置和多主多从配置)
- python支持面向对象的程序设计(Python面向对象程序设计之类的定义与继承简单示例)
- 搭建nuget服务器
- css3中基本选择符(CSS3 clip-path 用法介绍详解)
- docker和tomcat建立连接(如何基于Dockerfile构建tomcat镜像)
- 如何提升代码质量
- 云服务器增加硬盘分区(云服务器硬盘要根据业务类型选择)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9