如何使用django ratelimit或节流功能设置多个速率限制(每10秒、每10分钟、每1天)?

如何使用django ratelimit或节流功能设置多个速率限制(每10秒、每10分钟、每1天)?,django,django-rest-framework,throttling,rate-limiting,Django,Django Rest Framework,Throttling,Rate Limiting,我想根据10秒、10分钟和1天的持续时间设置我的视图的速率限制。假设用户可以每10秒发送20个请求,每10分钟发送100个请求,每天发送1000个请求 我尝试过节流,但找不到任何方法来设置多个请求。 我尝试过django ratelimit包,但我也找不到任何这样的选项,因为它为rate设置了一个字符串,比如rate='5/10m'。 请告诉我是否有任何解决此问题的方法这在中有介绍。您可以在同一视图上定义多个@ratelimit装饰器 此外,费率的格式允许您添加: 您还可以指定单位数,即:X/Y

我想根据10秒、10分钟和1天的持续时间设置我的视图的速率限制。假设用户可以每10秒发送20个请求,每10分钟发送100个请求,每天发送1000个请求

我尝试过节流,但找不到任何方法来设置多个请求。 我尝试过django ratelimit包,但我也找不到任何这样的选项,因为它为rate设置了一个字符串,比如rate='5/10m'。 请告诉我是否有任何解决此问题的方法

这在中有介绍。您可以在同一视图上定义多个
@ratelimit
装饰器

此外,费率的格式允许您添加:

您还可以指定单位数,即:
X/Yu
,其中
Y
是单位数。如果省略
u
,则假定为秒。因此,以下是等效的,都是指“每五分钟一百个请求”:

100/5m
100/300s
100/300
因此,您可以将这些限制定义为:

from ratelimit.decorators import ratelimit

@ratelimit(key='user', rate='20/10s')
@ratelimit(key='user', rate='100/10m')
@ratelimit(key='user', rate='1000/d')
def some_view(request):
    pass

因为我使用下面的,不适用于一般视图

@method_decorator(ratelimit(key='user', rate='1000/d'), name='dispatch')
class MyViewSet(ViewSet):
我找到了另一个解决办法

from django.http import JsonResponse
from ratelimit.decorators import ratelimit

class RateLimitForSecurity(View):
    @ratelimit(key='ip', rate='30/m')
    def dispatch(self, request, *args, **kwargs):
        was_limited = getattr(request, 'limited', False)
        if was_limited:
            return JsonResponse({"code": 1, 'msg': 'try many times'},json_dumps_params={'ensure_ascii':False})

        return super().dispatch(request, *args, **kwargs)

class IndexView(RateLimitForSecurity, generic.ListView):
      # same as before

如何为视图集设置此速率限制?下面是我的视图集,我想为它实现费率限制。类AssetParentTableViewset(viewsets.ModelViewSet):queryset=AssetParentTable.objects.all()序列化程序\u类=AssetParentTableSerializer过滤器集\u类=AssetParentTableFilter@saadatali:您可以在
dispatch
方法上应用
method\u decorator
s。
from django.http import JsonResponse
from ratelimit.decorators import ratelimit

class RateLimitForSecurity(View):
    @ratelimit(key='ip', rate='30/m')
    def dispatch(self, request, *args, **kwargs):
        was_limited = getattr(request, 'limited', False)
        if was_limited:
            return JsonResponse({"code": 1, 'msg': 'try many times'},json_dumps_params={'ensure_ascii':False})

        return super().dispatch(request, *args, **kwargs)

class IndexView(RateLimitForSecurity, generic.ListView):
      # same as before