Rest_Framework之频率组件部分

本文深入探讨了Django Rest Framework中的频率限制组件,包括自定义频率限制类的实现及使用预置的SimpleRateThrottle类的方法。通过实例展示了如何限制同一IP在一分钟内的访问次数,并介绍了全局与局部应用频率限制的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RestFramework之频率组件源码部分

频率组件的源码部分和权限组件流程一模一样的,这里就不多说了,直接上源码的主要逻辑部分:

def check_throttles(self, request):
        """
        Check if request should be throttled.
        Raises an appropriate exception if the request is throttled.
        """
        for throttle in self.get_throttles():
            if not throttle.allow_request(request, self):
                self.throttled(request, throttle.wait())

明确表示我们写的频率类需要一个allow_request()方法:

频率类(完成一分钟同一个ip只能访问三次):

import time
from rest_framework.throttling import BaseThrottle


class MyThrottle(BaseThrottle):
    visited_record = {}

    def __init__(self):
        self.history = None

    def allow_request(self, request, my_cbv):

        # 这个my_cbv是源码中传的我们的视图类,这里我们也要传进去
        # print(self.get_ident(request))  # 可以获取本次请求的ip
        ip = request.META.get("REMOTE_ADDR")
        if ip not in self.visited_record:
            self.visited_record[ip] = []

        current_time = time.time()
        history = self.visited_record[ip]
        self.history = history
  
        while history and current_time - history[-1] > 60:  # 把与当前访问时间相差大于60秒的时间都删掉
            history.pop()

        if len(history) > 2:  # 第三次访问,列表中只有2个值,也满足条件,大于2个值时不满足条件
            return False
        history.insert(0, current_time)
        return True

    def wait(self):
        """
        用于返回还剩多少时间访问;
        
        本次访问时间:9:50:55
        [09:50:30, 09:50:20, 09:50:10]   剩余 60 - (9:50:55 - 09:50:10)秒才能访问
        :return:
        """
        c_time = time.time()
        return 60 - (c_time - self.history[-1])  

视图类:

class BookView(ModelViewSet):
    authentication_classes = [UserAuth]      #认证类
    permission_classes = [UserPerm]        #权限类
    throttle_classes = [MyThrottle]      #频率类
    queryset = Book.objects.all()
    serializer_class = BookSerializer

效果如下:

可以在全局settings配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': 
        'app01.utils.auth_class.UserAuth',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'app01.utils.permission_class.VipPermission',
    ),
    'DEFAULT_THROTTLE_CLASSES': (
        'app01.utils.throttle_class.MyThrottle',
    ),
}

 二、使用restframework组件中的提供的访问限制

实现方式和我们上面的方式基本相同;

基于限制ip的类:SimpleRateThrottle   

基于ip的访问限制:

频率类——局部:

from rest_framework.throttling import SimpleRateThrottle

class MyThrottle(SimpleRateThrottle):

    rate = '5/m'

    def get_cache_key(self, request, view):  # 这个方法也是必须要有
        return self.get_ident(request)

 

在视图类中指定频率类

class BookView(ModelViewSet):

    throttle_classes = [app_throttles.RateThrottle]

    queryset = Book.objects.all()
    serializer_class = BookSerializer

 

 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

频率类——全局:

from rest_framework.throttling import SimpleRateThrottle

class MyThrottle(SimpleRateThrottle):

    scope = "visit_rate"  # 这个值决定了在配置时使用哪个变量描述限制的频率,必须在settings里面配置

    def get_cache_key(self, request, view):  # 这个方法也是必须要有
        return self.get_ident(request)

这次只能在setttings中配置:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'app01.utils.throttle_class.MyThrottle',
    ),
    "DEFAULT_THROTTLE_RATES": {
        "visit_rate": "10/m",   # 这个参数就是频率类中定义的那个参数scope, 其中第一个数字10表示10次,后面的m表示一分钟,还有s,一秒, h, 一小时, d, 一天
    }
}
 duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}

转载于:https://www.cnblogs.com/fengchong/p/10100488.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值