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中的面向对象编程详解(上)
Apr 13 Python
python判断windows系统是32位还是64位的方法
May 11 Python
Python入门教程之if语句的用法
May 14 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
Python实现堆排序的方法详解
May 03 Python
python rsa 加密解密
Mar 20 Python
Python处理文本换行符实例代码
Feb 03 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
Django重设Admin密码过程解析
Feb 10 Python
Keras自定义IOU方式
Jun 10 Python
python函数的两种嵌套方法使用
Apr 02 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下对字符串的递增运算代码
2010/08/21 PHP
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
php实现RSA加密类实例
2015/03/26 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
vue实现评论列表功能
2019/10/25 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
Python的re模块正则表达式操作
2016/05/25 Python
python数据处理实战(必看篇)
2017/06/11 Python
在Django中实现添加user到group并查看
2019/11/18 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
模具设计与制造专业推荐信
2014/02/16 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
物业管理交接协议书
2016/03/24 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫
golang连接MySQl使用sqlx库
2022/04/14 Golang
5个实用的JavaScript新特性
2022/06/16 Javascript