django DRF请求访问频率限制

news/2025/2/19 10:20:07

Django REST framework(DRF)提供了一个throttle_classes属性,可以用于限制API的访问频率。它可以防止恶意用户发送大量请求以消耗服务器资源。

使用throttle_classes属性,需要在settings.py中配置REST_FRAMEWORK

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle', # 匿名用户访问频率限制
        'rest_framework.throttling.UserRateThrottle', # 登录用户访问频率限制
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day', # 匿名用户每天最多100次请求
        'user': '1000/day', # 登录用户每天最多1000次请求
    }
}

这里使用了两个默认的限制类:AnonRateThrottleUserRateThrottleAnonRateThrottle用于限制匿名用户的访问频率,UserRateThrottle用于限制登录用户的访问频率。

DEFAULT_THROTTLE_RATES中,我们可以为每个限制类指定一个速率限制,例如'anon': '100/day'表示每天匿名用户最多可以发送100个请求。

如果需要自定义限制类,可以继承throttling.SimpleRateThrottle类并实现allow_request()get_cache_key()方法。例如:

from rest_framework.throttling import SimpleRateThrottle

classCustomThrottle(SimpleRateThrottle):
    rate = '10/hour'# 每小时最多10次请求
    def get_cache_key(self, request, view):
        return self.get_ident(request) # 使用IP地址作为缓存key
    def allow_request(self, request, view):
        ifnot self.rate:
            return True

        self.key = self.get_cache_key(request, view)
        if self.key isNone:
            return True

        self.history = self.cache.get(self.key, [])
        self.now = self.timer()

        while self.history and self.history[-1] <= self.now - self.duration:
            self.history.pop()

        if len(self.history) >= self.num_requests:
            return False

        self.history.insert(0, self.now)
        self.cache.set(self.key, self.history, self.duration)
        return True

在上面的例子中,我们定义了一个名为CustomThrottle的限制类,它每小时最多允许10次请求。get_cache_key()方法返回一个缓存key,这里使用了请求的IP地址。allow_request()方法用于判断当前请求是否允许访问,如果超过了限制次数,则返回False,否则返回True

然后在视图类中使用throttle_classes属性指定限制类即可:

from rest_framework.throttling import AnonRateThrottle
from myapp.throttling import CustomThrottle
classMyView(APIView):
    throttle_classes = [AnonRateThrottle, CustomThrottle]

    def get(self, request):
        # ...

在上面的例子中,我们指定了两个限制类:AnonRateThrottleCustomThrottle,它们分别用于限制匿名用户和所有用户的访问频率。

文章来源:https://blog.csdn.net/LINGK98/article/details/129595479
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.niftyadmin.cn/n/155724.html

相关文章

simscape仿真总结2-机器人拖拽控制仿真实现

最近用simscape进行机器人的仿真&#xff0c;记录和总结一下学习心得和踩过的坑。 参照B站一位up主的视频做的仿真&#xff1a; 4自由度机械臂从Solidworks to Simscape 实现运动仿真 我也做了一个自己的简单小demo: 注意几点&#xff1a; simscape的数据是物理信号&…

设计模式(二十三)----行为型模式之中介者模式

1 概述 一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复杂的网状结构&#xff0c;这是一种过度耦合的架构&#xff0c;即不利于类的复用&#xff0c;也不稳定。例如在下左图中&#xff0c;有六个…

100. 增减序列

给定一个长度为 n 的数列 a1,a2,…,an&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数都加一或者都减一。 求至少需要多少次操作才能使数列中的所有数都一样&#xff0c;并求出在保证最少次数的前提下&#xff0c;最终得到的数列可能有多少种。 输入…

小孩鼻子出血七种原因(小孩流鼻血是什么原因儿童鼻出血怎么回事

大家好&#xff0c;小源来回答以上问题。儿童鼻出血有七个原因&#xff0c;儿童鼻出血的原因是什么&#xff0c;儿童鼻出血怎么了很多人不知道&#xff0c;现在让我们一起看看&#xff01;1、儿童流鼻血的主要原因之一是鼻粘膜脆弱&#xff0c;也是习惯性流鼻血的主要原因&…

C语言递归学习

C语言递归 递归在C语言中是一种非常重要的编程技巧&#xff0c;它使得程序能够更加简洁、优雅地解决一些问题。 递归的基本思想是将一个大问题分解为若干个小问题&#xff0c;直到问题的规模足够小可以直接解决为止。在C语言中&#xff0c;递归函数就是实现这个思想的主要工具…

Linux -- 磁盘存储管理 分区工具 parted

对于磁盘存储&#xff0c;既然要管理&#xff0c;要分区&#xff0c;那必然就少不了要 分区的工具对于分区工具&#xff0c;常用的有三个&#xff0c; fdisk 、gdisk、parted ~&#xff01;&#xff01;本次&#xff0c;先介绍下 parted 分区工具前面几篇文章讲了 fdisk 、 gdi…

Pytorch教程之张量

Pytorch教程之张量 说明&#xff1a;本文内容全部是搬运的&#xff0c;仅仅是记录一下&#xff0c;更多详细内容可以参考pytorch教程。 1、简介 Tensor中文翻译张量&#xff0c;是一个词不达意的名字。张量在不同学科中有不同的意义&#xff0c;在深度学习中张量表示的是一个…

访问学者申请美国J1签证英语要求有规定吗?

美国J1签证英语要求有明显的规定&#xff0c;首选要求申请人要考托福或雅思考试&#xff0c;或由学术机构或语言学校出具的证明文件&#xff0c;或由留学单位出具的面试证明。以上三个要求中满足一个就可以&#xff0c;只要交流没有问题&#xff0c;六级可以也是可以的。 美国…