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实现的二叉树算法和kmp算法实例
Apr 25 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
PyTorch-GPU加速实例
Jun 23 Python
pandas参数设置的实用小技巧
Aug 23 Python
python openssl模块安装及用法
Dec 06 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 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初学者们头痛的十四个问题
2007/01/15 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
浅谈js中的this问题
2017/08/31 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
编写Python的web框架中的Model的教程
2015/04/29 Python
Python实现统计单词出现的个数
2015/05/28 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
python获取代码运行时间的实例代码
2018/06/11 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python如何制作缩略图
2019/04/30 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
司法助理专业自荐书
2014/06/13 职场文书
党委领导班子整改方案
2014/09/30 职场文书
2015年复活节活动总结
2015/02/27 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏