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写的服务监控程序实例
Jan 31 Python
Python 迭代器工具包【推荐】
May 06 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python机器学习logistic回归代码解析
Jan 17 Python
Numpy数组转置的两种实现方法
Apr 17 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
Python常见数据类型转换操作示例
May 08 Python
python实现批量修改服务器密码的方法
Aug 13 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
Python request操作步骤及代码实例
Apr 13 Python
python 基于UDP协议套接字通信的实现
Jan 22 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的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
php-app开发接口加密详解
2018/04/18 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JS 判断代码全收集
2009/04/28 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
django使用graphql的实例
2020/09/02 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
幼师自荐信
2013/10/26 职场文书
黄河的主人教学反思
2014/02/07 职场文书
护士岗位职责
2014/02/16 职场文书
期末学生评语大全
2014/04/24 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android