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 错误和异常小结
Oct 09 Python
Python中的rfind()方法使用详解
May 19 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
python实现诗歌游戏(类继承)
Feb 26 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
python opencv如何实现图片绘制
Jan 19 Python
python自定义函数def的应用详解
Jun 03 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 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验证码类(分享)
2013/08/06 PHP
php图片缩放实现方法
2014/02/20 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
zookeeper python接口实例详解
2018/01/18 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
python常量折叠基础知识点讲解
2021/02/28 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
编写strcpy函数
2014/06/24 面试题
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
测绘工程个人的自我评价
2013/11/10 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
小学生优秀评语大全
2014/04/22 职场文书
爱国演讲稿500字
2014/05/04 职场文书
文明班级建设方案
2014/05/15 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书