Django REST framework 如何实现内置访问频率控制

 更新时间:2019年07月23日 14:22:45   作者:little_pd  
这篇文章主要介绍了Django REST framework 内置访问频率控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

对匿名用户采用 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基础之教你怎么在M1系统上使用pandas

    Python基础之教你怎么在M1系统上使用pandas

    这篇文章主要介绍了Python基础之教你怎么在M1系统上使用pandas,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • python中关于property的最详细使用方法

    python中关于property的最详细使用方法

    这篇文章主要介绍了python中关于property的最详细使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • python 比较字典value的最大值的几种方法

    python 比较字典value的最大值的几种方法

    这篇文章主要介绍了python 比较字典value的最大值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python从临时邮箱获取验证码的操作代码

    Python从临时邮箱获取验证码的操作代码

    这篇文章主要介绍了Python从临时邮箱获取验证码的操作代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • python2中的中文乱码

    python2中的中文乱码

    这篇文章主要介绍了python2中的中文乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Python/R语言分别实现斐波那契数列的示例详解

    Python/R语言分别实现斐波那契数列的示例详解

    这篇文章将通过两个小问题:年龄计算、斐波那契数列,带领大家深入浅出的理解两种语言的基本语法,并用以实际场景,需要的可以参考一下
    2022-03-03
  • pytorch之scatter_的用法及说明

    pytorch之scatter_的用法及说明

    这篇文章主要介绍了pytorch之scatter_的用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python匹配中文的正则表达式

    Python匹配中文的正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。接下来通过本文给大家介绍Python匹配中文的正则表达式,感兴趣的朋友一起学习吧
    2016-05-05
  • Python实现弹球小游戏

    Python实现弹球小游戏

    这篇文章主要介绍了Python实现弹球小游戏的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • python连接mysql实例分享

    python连接mysql实例分享

    本文给大家汇总介绍了使用python连接mysql的几个实例,非常的简单实用,有需要的小伙伴可以参考下
    2016-10-10

最新评论