DRF 权限和频率
Django Rest Framework 权限组件DRF的权限?权限组件源码解析我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本,认证,权限,频率控制走的源码流程大致相同~~大家也可以在源码里看到~~ 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 我们先看到在rest_framework.permissions这个文件中~存放了框架给我们提供的所有权限的方法~~ 我这里就不带着大家详细去看每一个了~大家可以去浏览一下每个权限类~看看每个都是干嘛的~~ 这里主要说下BasePermission 这个是我们写权限类继承的一个基础权限类~~~? 权限的详细用法在这里我们一定要清楚一点~我们的Python代码是一行一行执行的~那么执行initial方法初始化这些组件的时候~~ 也是有顺序的~~我们的版本在前面~然后是认证,然后是权限~ 最后是频率~~所以大家要清楚~~ 我们的权限执行的时候~我们的认证已经执行结束了~~~ 前提在model中的UserInfo表中加了一个字段~用户类型的字段~~做好数据迁移~~ =
==
</span><span style="color: #0000ff;">def</span> get(self,*args,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(request.user)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(request.auth)
username </span>=<span style="color: #000000;"> request.user
</span><span style="color: #0000ff;">return</span> Response(username)</pre>
REST_FRAMEWORK =
:
: [,
:
:
: [
Django Rest Framework 频率组件DRF的频率频率限制是做什么的开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用。 我们的DRF提供了一些频率限制的方法,我们看一下。 频率组件源码版本,认证,权限,频率这几个组件的源码是一个流程,这里就不再带大家走源码了~ 相信大家可以自己看懂了~~下面我们谈谈频率组件实现的原理~~ 频率组件原理DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定义的方法来实现。 当我们请求进来,走到我们频率组件的时候,DRF内部会有一个字典来记录访问者的IP, 以这个访问者的IP为key,value为一个列表,存放访问者每次访问的时间, {? IP1: [第三次访问时间,第二次访问时间,第一次访问时间],} 把每次访问最新时间放入列表的最前面,记录这样一个数据结构后,通过什么方式限流呢~~ 如果我们设置的是10秒内只能访问5次, -- 1,判断访问者的IP是否在这个请求IP的字典里 -- 2,保证这个列表里都是最近10秒内的访问的时间 判断当前请求时间和列表里最早的(也就是最后的)请求时间的查 如果差大于10秒,说明请求以及不是最近10秒内的,删除掉, 继续判断倒数第二个,直到差值小于10秒 -- 3,判断列表的长度(即访问次数),是否大于我们设置的5次, 如果大于就限流,否则放行,并把时间放入列表的最前面。 频率组件的详细用法频率组件的配置方式其实跟上面的组件都一样,我们看下频率组件的使用。 VISIT_RECORD =
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span><span style="color: #000000;">(self):
self.history </span>=<span style="color: #000000;"> None
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> allow_request(self,view):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
自定义频率限制60秒内只能访问三次
</span><span style="color: #800000;">"""</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 获取用户IP</span>
ip = request.META.get(<span style="color: #800000;">"</span><span style="color: #800000;">REMOTE_ADDR</span><span style="color: #800000;">"</span><span style="color: #000000;">)
timestamp </span>=<span style="color: #000000;"> time.time()
</span><span style="color: #0000ff;">if</span> ip <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> VISIT_RECORD:
VISIT_RECORD[ip] </span>=<span style="color: #000000;"> [timestamp,]
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
history </span>=<span style="color: #000000;"> VISIT_RECORD[ip]
self.history </span>=<span style="color: #000000;"> history
history.insert(0,timestamp)
</span><span style="color: #0000ff;">while</span> history <span style="color: #0000ff;">and</span> history[-1] < timestamp - 60<span style="color: #000000;">:
history.pop()
</span><span style="color: #0000ff;">if</span> len(history) > 3<span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> False
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> wait(self):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
限制时间还剩多少
</span><span style="color: #800000;">"""</span><span style="color: #000000;">
timestamp </span>=<span style="color: #000000;"> time.time()
</span><span style="color: #0000ff;">return</span> 60 - (timestamp - self.history[-1])</pre>
REST_FRAMEWORK =
: [
rest_framework.throttling <span style="color: #0000ff;">class<span style="color: #000000;"> MyVisitThrottle(SimpleRateThrottle):
scope = <span style="color: #800000;">"<span style="color: #800000;">WD<span style="color: #800000;">"
REST_FRAMEWORK =
: [:,
我们可以在postman~~或者DRF自带的页面进行测试都可以~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |