如何使用Django-Ratelimit或节流设置每10分钟,每10分钟,每10分钟设置多率限制



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

我尝试了节流,但找不到设置多个请求的任何方法。我尝试了Django Ratelimit软件包,但是我找不到任何此类选项,因为它设置了一个字符串的速率,例如速率='5/10m'。请让我知道是否有任何解决此问题的方法

django-ratelimit 的文档中涵盖了这一点。您可以在同一视图上定义多个@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

对于基于类的视图(例如ViewSet(,您可以使用 @method_decorator 进行装饰,例如:

django.utils.decorators import method_decorator
from ratelimit.decorators import ratelimit
@method_decorator(ratelimit(key='user', rate='20/10s'), name='dispatch')
@method_decorator(ratelimit(key='user', rate='100/10m'), name='dispatch')
@method_decorator(ratelimit(key='user', rate='1000/d'), name='dispatch')
class MyViewSet(ViewSet):
    # ...

因为我在下面使用,而不是用于通用视图。

@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

我正在研究此问题,发现您可以覆盖油门类功能parse_rate,并且可以通过您的需求来定制

from rest_framework.throttling import UserRateThrottle
class ThirdPartyMonthlyThrottle(UserRateThrottle):
    scope = 'third_party_monthly'
    def parse_rate(self, rate):
        if rate is None:
            return None, None
        num, period = rate.split('/')
        num_requests = int(num)
        duration = int(period)*86400
        return num_requests, duration
'DEFAULT_THROTTLE_RATES': {
        'third_party_monthly': '3/30'
    }

这可以解释为每月3个请求

您可以这样做

from ratelimit.decorators import ratelimit
from http import HTTPStatus
@ratelimit(key='user_or_ip', rate='1/10m', method=['POST'])
def ajax_add_review(request, username):
    was_limited = getattr(request, 'limited', False)
        if was_limited:
            return JsonResponse({"error": 'limit crossed'}, status=HTTPStatus.BAD_REQUEST)

相关内容

最新更新