Django REST framework 如何实现内置访问频率控制


Posted in Python onJuly 23, 2019

对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):
  """匿名用户访问频率限制"""
  scope = "AnonymousUser" # 随便写的,可以作为key保存在缓存中

  def get_cache_key(self, request, view):
    return self.get_ident(request)

class UserThrottle(SimpleRateThrottle):
  """登录用户访问频率限制"""
  scope = "LoginUser"

  def get_cache_key(self, request, view):return request.user

可以配置redis

CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
      "CONNECTION_POOL_KWARGS": {"max_connections": 100}
      # "PASSWORD": "密码",
    }
  }
}

匿名用户的访问频率限制,这里设置在全站下,如下:

REST_FRAMEWORK = {
  "DEFAULT_THROTTLE_CLASSES": ["appxx.utils.VisitThrottle"],
  "DEFAULT_THROTTLE_RATES":{
      "AnonymousUser": "3/m", # 匿名用户一分钟可以访问3次,秒(s)、分(m)、时(h)、天(d)
      "LoginUser": "10/m", # 登录用户一分钟可以访问10次
    }
}

登录用户的访问频率设置在单独的视图中,而视图依赖身份认证才能辨别用户是否登陆了,所以设置如下:

class BookViewSet(viewsets.ModelViewSet):
  authentication_classes = [TokenAuthentication]
  throttle_classes = [UserThrottle]
  queryset = models.Book.objects.all()
  serializer_class = serializers.BookSerializer

用户身份认证如下:

from rest_framework import authentication
from rest_framework import exceptionsfrom appxx import models

class TokenAuthentication(authentication.BaseAuthentication):
  """身份认证"""
  def authenticate(self, request):
    token = request.GET.get("token")
    obj = models.UserAuthToken.objects.filter(token=token).first()
    if not obj:
      raise exceptions.AuthenticationFailed("验证失败!")
    else:
      return (obj.user.username, obj.token)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
django基础之数据库操作方法(详解)
May 24 Python
python 内置函数filter
Jun 01 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 #Python
python视频按帧截取图片工具
Jul 23 #Python
python如何实现从视频中提取每秒图片
Oct 22 #Python
详解Django 时间与时区设置问题
Jul 23 #Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 #Python
python 抓包保存为pcap文件并解析的实例
Jul 23 #Python
Django ModelForm组件使用方法详解
Jul 23 #Python
You might like
PHP新手上路(十一)
2006/10/09 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
Python3安装Scrapy的方法步骤
2017/11/23 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
中学生国旗下讲话稿
2014/04/26 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
先进学校事迹材料
2014/12/30 职场文书
现货白银电话营销话术
2015/05/29 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
七年级作文之英语老师
2019/10/28 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python