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的subprocess模块总结
Nov 07 Python
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
python找出列表中大于某个阈值的数据段示例
Nov 24 Python
python 利用Pyinstaller打包Web项目
Oct 23 Python
python归并排序算法过程实例讲解
Nov 04 Python
Restful_framework视图组件代码实例解析
Nov 17 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
小议Javascript中的this指针
2010/03/18 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
js实现功能比较全面的全选和多选
2017/03/02 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
js下载文件并修改文件名
2017/05/08 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python简单生成随机数的方法示例
2018/03/31 Python
Django框架多表查询实例分析
2018/07/04 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
护理助产毕业生的求职信
2014/03/02 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
建筑学专业自荐书
2014/07/09 职场文书
初中成绩单评语
2014/12/29 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle