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的dict,set,list,tuple应用详解
Jul 24 Python
Python中Random和Math模块学习笔记
May 18 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
python如何使用Redis构建分布式锁
Jan 16 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
python实现语音常用度量方法的代码详解
May 25 Python
pytorch 梯度NAN异常值的解决方案
Jun 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中常用的预定义变量小结
2012/05/09 PHP
PHP new static 和 new self详解
2017/02/19 PHP
php实现微信模板消息推送
2018/03/30 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
javaScript基础详解
2017/01/19 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
Python中如何获取类属性的列表
2016/12/26 Python
python调用百度语音REST API
2018/08/30 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
汉语言文学毕业生求职信
2013/10/01 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
群教班子对照检查材料
2014/08/26 职场文书
保研专家推荐信范文
2015/03/25 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
老人院义工活动感想
2015/08/07 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书