前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django Rest Framework 限流(上)

Django Rest Framework 限流(上)

作者头像
小团子
发布2019-07-18 11:34:18
5730
发布2019-07-18 11:34:18
举报
文章被收录于专栏:数据云团数据云团

Django Rest Framework 权限(下)

  • 简介
  • 思路

一、节流

① 简介

节流又叫限流,限制访问。通常一个用户在多次请求一个页面,或者点击一个链接的时候,前几次点击是没问题的,但是一旦连续几次之后,就会出现访问受限离下一次访问还有50秒等的字样,在 django rest framework 中有一个专门的组件来做限制访问。

② 思路

一旦一个用户向资源发送请求,那么根据用户的身份就有两种情况,匿名用户和认证用户。那么根据用户的身份怎么做限制访问?就是要找到用户的唯一标识。

  • 匿名用户:对于匿名用户,唯一能用来标识的只有请求的IP
  • 认证用户:认证用户的用户名,或者用户ID等。

用户标识的问题解决了,假设设置的是每分钟只能访问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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档