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中writelines()方法的使用
May 25 Python
python中字符串前面加r的作用
Jun 04 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
pip安装python库的方法总结
Aug 02 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
python hmac模块验证客户端的合法性
Nov 07 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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 404错误页面实现代码
2009/06/22 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
Python常用数据分析模块原理解析
2020/07/20 Python
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
董事长秘书岗位职责
2013/11/29 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
超市活动计划书
2014/04/24 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
PHP 时间处理类Carbon
2022/05/20 PHP