Django Rest Framework 权限(下)
一、节流
① 简介
节流又叫限流,限制访问。通常一个用户在多次请求一个页面,或者点击一个链接的时候,前几次点击是没问题的,但是一旦连续几次之后,就会出现访问受限,离下一次访问还有50秒等的字样,在 django rest framework 中有一个专门的组件来做限制访问。
② 思路
一旦一个用户向资源发送请求,那么根据用户的身份就有两种情况,匿名用户和认证用户。那么根据用户的身份怎么做限制访问?就是要找到用户的唯一标识。
用户标识的问题解决了,假设设置的是每分钟只能访问5次,也就是5次/min。当用户发送请求,可以拿到用户的唯一标识,判断用户是第几次访问。有下面几种情况:
一分钟之内
根据上面的情况可以得出以下思路:
当一个用户发送请求的时候,可以在缓存(django rest framework 就是这么做的)中生成一个字典,字典的键值对分别是用户的唯一标识和用户的访问时间,例如下面:
标识第一次访问时间是68秒,第二次访问时间是89秒,第三次访问时间是110秒。
第一步:当用户第一次发送请求的时候,缓存 VISIT_RECORD 中没有它的键,就会添加一个键是它来表示,值是一个列表,列表中存放它的第一次访问时间为 T1。
第二步:当再次发送请求的时候,会先在缓存 VISIT_RECORD 中找有没有它的键,如果没有,会返回第一步。如果有,取出列表,查看列表中的最后一次访问值 T1,并与本次访问的时间 Tn 比较,如果 Tn - T1 > 60s,则将 T1 删除,如果 Tn - T1 < 60s,则保留 T1,因为要保证一分钟之内的访问次数。
第三步:判断当前列表中保存的时间的个数,如果小于5个,说明一分钟之内还没有访问5次,将访问时间 Tn 插入到列表头。如果个数超过5个,则说明一分钟已经访问过5次,本次访问已经是第6次,则不插入列表。
这样根据思路就可以写出下面限流类:
return True
return False