DRF之限制单位时间访问次数

1、节流源码流程:

# step 1
def dispatch(self, request, *args, **kwargs):
    try:
        self.initial(request, *args, **kwargs)

# step 2
def initial(self, request, *args, **kwargs):
    self.perform_authentication(request)  # 先认证
    self.check_permissions(request)  # 随后权限管理
    self.check_throttles(request)  # 最后是节流管理

# step 3
def check_throttles(self, request):
    for throttle in self.get_throttles():
        # 调用类的allow_request函数,返回False,则节流有效,反之,不节流
        if not throttle.allow_request(request, self):
            self.throttled(request, throttle.wait())

# step 4 :获取节流类的实例化对象列表
def get_throttles(self):
    return [throttle() for throttle in self.throttle_classes]

# step 5

from rest_framework.throttling import BaseThrottle

# 默认的节流类
class SimpleRateThrottle(BaseThrottle):
    cache = default_cache
    timer = time.time
    cache_format = 'throttle_%(scope)s_%(ident)s'
    scope = None
    THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES  # 可以自定义

    def get_cache_key(self, request, view):
        pass

2、自定义节流:

# 相关参数的解析方式
def parse_rate(self, rate):
    if rate is None:
        return (None, None)

    num, period = rate.split('/')
    num_requests = int(num)
    duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
    return (num_requests, duration)

# setting.py
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES':{
        'anon':'5/m'  # 表示每分钟只能访问5次数
    },
}

# views.py
class MyThrottle(SimpleRateThrottle):
    scope = 'anon'  # 标识符

    def get_cache_key(self, request, view):
        return self.cache_format % {
            'scope': self.scope,
            'ident': self.get_ident(request)
        }

class Throttle(object):
    throttle_classes = [MyThrottle,]

class UserView(Auth,Throttle,APIView):
    """所有用户都有权限,也可以限制匿名用户,去掉Auth类参数即可"""
    def get(self,request,*args,**kwargs):
        return HttpResponse('<h1>用户界面</h1>')

3、错误页面:

4、请求次数限制方法,可以对ip(对代理用户无效)、用户名或者手机等特定标识节流:

dict={
    ip:[11:12,11:10,11:01,]  # 最新访问时间从左侧插入
    # 例如若限制为:5/m,那么每次插入元素前都会与相应的元素比较时间差,若在时间差内则插入,否则不插入
}

原文地址:https://www.cnblogs.com/fqh202/p/9398364.html

时间: 2024-10-22 04:08:09

DRF之限制单位时间访问次数的相关文章

[SpringMVC]自定义注解实现控制器访问次数限制

我们需要根据IP去限制用户单位时间的访问次数,防止刷手机验证码,屏蔽注册机等,使用注解就非常灵活了 1 定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented//最高优先级 @Order(Ordered.HIGHEST_PRECEDENCE) public @interface RequestLimit { /** * * 允许访问的次数,默认值MAX_VALUE */ int count(

@interface [SpringMVC+redis]自定义aop注解实现控制器访问次数限制

我们需要根据IP去限制用户单位时间的访问次数,防止刷手机验证码,屏蔽注册机等,使用注解就非常灵活了 1 定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented//最高优先级 @Order(Ordered.HIGHEST_PRECEDENCE) public @interface RequestLimit { /** * * 允许访问的次数,默认值MAX_VALUE */ int count(

Nginx中如何限制某个IP同一时间段的访问次数

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包, 造成对方服务器资源耗尽,一直到宕机崩溃. cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同

nginx限制某个IP同一时间段的访问次数

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃. cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一

[转]nginx限制某个IP同一时间段的访问次数

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃. cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一

超大文件(1TB)统计访问次数最多的来源IP及访问次数

题目解读 1. 文件格式:访问时间,来源IP,响应结果,响应耗时 2. 文件大小:超大规模,TB数量级 解题思路 首先,数据量过大,通过内存计算肯定是不可行的. 考虑采用分治,将大文件切割成小文件,再对小文件分析,找出访问次数最多的,此时将问题转化为:切割小文件算法 具体思路如下: 将1T的文件按照IP的高8位(代码是按照高8位实现的,ipv4的高位地址不均匀,按照低8位>比较合理)分隔成2^8份. 每一份写入到文件名为"tmp_{高8位地址}"的文件中,文件中的数据为低24位的

Spark实战--寻找5亿次访问中,访问次数最多的人

问题描述 对于一个大型网站,用户访问量尝尝高达数十亿.对于数十亿是一个什么样的概念,我们这里可以简单的计算一下.对于一个用户,单次访问,我们通常会记录下哪些数据呢? 1.用户的id 2.用户访问的时间 3.用户逗留的时间 4.用户执行的操作 5.用户的其余数据(比如IP等等) 我们单单从用户id来说,比如10011802330414,这个ID,那么我们一个id差不多就是一个long类型,因为在大量数据存储的时候,我们都是采用文本存储.因此对于5亿个用户ID,完全存储在磁盘当中,大概是5G的大小,

Java web--Filter过滤器分IP统计访问次数

分IP统计访问次数即网站统计每个IP地址访问本网站的次数. 分析 因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便. 因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value.当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,即可:IP在Map中不存在,那么设置次数为1. 那么问题来了! 问题一:为什么使用Map存放? Map是一个由键值对组成的数据结构,其中所有的key组成一

SpringBoot 实现控制器 IP 访问次数限制

在 Web 中最经常发生的就是利用恶性 URL 访问刷爆服务器之类的攻击,今天我就给大家介绍一下如何利用自定义注解实现这类攻击的防御操作. 其实这类问题一般的解决思路就是:在控制器中加入自定义注解实现访问次数限制的功能. 具体的实现过程看下面的例子: package example.controller.limit;   import org.springframework.core.Ordered;   import org.springframework.core.annotation.Or