DRF-源码解析-4.2-限流的流程:drf的限流源码,drf流量控制流程,drf如何流量控制

本文详细描述了如何在DjangoRESTFramework中实现流量控制,通过设置唯一标识、缓存策略以及使用SimpleRateThrottle进行限流,确保API接口的稳定性和安全性。

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

请添加图片描述

流量控制的逻辑:

1、设置一个唯一标识,作为cache的key

2、请求访问时,构造唯一标识,从ceche中获取[时间1,时间2,时间3,…]

3、根据设置流量控制规则,如:5/m (一分钟最多访问5次),判断该唯一标识记录到cache中的访问时间的次数,是否满足请求的条件

4、不满足,就抛出异常,前端收到请求过快的响应。满足访问,就直接访问。

一、代码的准备

视图:

class TestAPIView(APIView):
    authentication_classes=[MyJWTAuthentication]
    permission_classes = [AdminPermission,]
    def get(self,request)
        return Respponse({
   'code':200,'msg':'测试通过'})

路由:

path('test/',views.TestAPIView.as_view())

请求方式:GET

流量控制类:

from rest_framework.throttling import SimpleRateThrottle


#对请求源的IP进行限制
class IPThrottle(SimpleRateThrottle):
    # 在settings中配置频率时使用到的关键字,有scope来指定
    scope = 'IP'

    def get_cache_key(self, request, view):
        return f'{self.scope}-{self.get_ident(request)}-throttle'
        # 这里return什么,就以什么作为限制,这里限制ip,直接return ip就可以
        return request.META.get('REMOTE_ADDR')
    # 可以在这里设置访问频率
    # def get_rate(self):
    #     return '3/m'

二、具体的流程

1、TestAPIView的as_view方法,当前实例对象没有,找父类的APIView的as_view

@classmethod
def as_view(cls, **initkwargs):
    #1、调用APIView父类的as_view方法
    view = super().as_view(**initkwargs)
    view.cls = cls
    view.initkwargs = initkwargs
    #2、去除掉csrf校验
    return csrf_exempt(view)

2、APIView的as_view是调用父类View的as_view方法

@classonlymethod
def as_view(cls, **initkwargs):
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)
        self.setup(request, *args, **kwargs)
        if not hasattr(self, 'request'):
            raise AttributeError(
                "%s instance has no 'request' attribute. Did you override "
                "setup() and forget to call super()?" % cls
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值