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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
详解Python中的条件判断语句
May 14 Python
python学习必备知识汇总
Sep 08 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
安装python及pycharm的教程图解
Oct 10 Python
np.random.seed() 的使用详解
Jan 14 Python
python实现连连看游戏
Feb 14 Python
2020版Python学习路线图(附学习资料)
Sep 15 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
Python rstrip()方法实例详解
2018/11/11 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
python关于倒排列的知识点总结
2020/10/13 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
房地产广告策划方案
2014/05/15 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
委托书范本
2014/09/13 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
入党自荐书范文
2015/03/05 职场文书
2015年林业工作总结
2015/05/14 职场文书
班级联欢会主持词
2015/07/03 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js