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中类的一些方法分析
Sep 25 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Python实现完整的事务操作示例
Jun 20 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
pytorch标签转onehot形式实例
Jan 02 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
解决Python安装cryptography报错问题
Sep 03 Python
python 常见的反爬虫策略
Sep 27 Python
Python中的 Set 与 dict
Mar 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 MYSQL 数据备份类
2009/06/19 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
利用Psyco提升Python运行速度
2014/12/24 Python
用python实现的线程池实例代码
2018/01/06 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python写一个随机点名软件的实例
2019/11/28 Python
Django视图、传参和forms验证操作
2020/07/15 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
Ajax的工作原理
2015/12/04 面试题
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
干部选拔任用方案
2014/05/26 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
研究生个人学年总结
2015/02/14 职场文书
税务会计岗位职责
2015/04/02 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript