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生成指定尺寸缩略图的示例
May 07 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python实现感知机(PLA)算法
Dec 20 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
python处理multipart/form-data的请求方法
Dec 26 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
python3.x 生成3维随机数组实例
Nov 28 Python
详解Python的三种拷贝方式
Feb 11 Python
python 还原梯度下降算法实现一维线性回归
Oct 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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php自定义错误处理用法实例
2015/03/20 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
python创建和删除目录的方法
2015/04/29 Python
Python解析树及树的遍历
2016/02/03 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python提取xml里面的链接源码详解
2019/10/15 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
网络管理员岗位职责
2014/03/17 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
村容村貌整治方案
2014/05/21 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android