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实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
python实现unicode转中文及转换默认编码的方法
Apr 29 Python
python2.7实现爬虫网页数据
May 25 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python爬取哈尔滨天气信息
Jul 14 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
Python接口测试环境搭建过程详解
Jun 29 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 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 过滤危险html代码
2009/06/29 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
javascript里的条件判断
2007/02/27 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
python threading模块操作多线程介绍
2015/04/08 Python
Python中的列表知识点汇总
2015/04/14 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
Pytorch之保存读取模型实例
2019/12/30 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
中学教师岗位职责
2013/11/26 职场文书
教师节商场活动方案
2014/02/13 职场文书
跑操口号
2014/06/12 职场文书
学校节能减排方案
2014/06/13 职场文书
经营理念标语
2014/06/21 职场文书
小学端午节活动总结
2015/02/11 职场文书
员工手册编写范本
2015/05/14 职场文书
大国崛起观后感
2015/06/02 职场文书
2016年公司新年寄语
2015/08/17 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
python实现进度条的多种实现
2021/04/29 Python