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 相关文章推荐
flask中的wtforms使用方法
Jul 21 Python
Python 字符串换行的多种方式
Sep 06 Python
python实现银联支付和支付宝支付接入
May 07 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
python数据挖掘需要学的内容
Jun 23 Python
Python tkinter模版代码实例
Feb 05 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
scrapy头部修改的方法详解
Dec 06 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
Prototype使用指南之array.js
2007/01/10 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
vue-axios使用详解
2017/05/10 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
python删除列表中重复记录的方法
2015/04/28 Python
Python实现端口检测的方法
2018/07/24 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
详解python中的Turtle函数库
2018/11/19 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
师范大学应届生求职信
2013/11/21 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android