首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置多个速率限制,每10秒,每10分钟,每1天,使用django-ratelimit或throttling?

如何设置多个速率限制,每10秒,每10分钟,每1天,使用django-ratelimit或throttling?
EN

Stack Overflow用户
提问于 2019-07-04 03:25:32
回答 3查看 1.9K关注 0票数 1

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

我尝试过限制,但找不到任何方法来设置多个请求。我已经尝试过django-ratelimit包,但我也找不到任何这样的选项,因为它为rate设置了一个字符串,例如rate = '5/10m‘。如果有解决这个问题的办法,请告诉我。

EN

回答 3

Stack Overflow用户

发布于 2020-02-27 17:39:58

因为我使用的是下面的,而不是泛型视图。

代码语言:javascript
复制
@method_decorator(ratelimit(key='user', rate='1000/d'), name='dispatch')
class MyViewSet(ViewSet):

我找到了另一个解决方案。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-07-16 01:17:30

我在做这方面的工作,发现您可以覆盖限制类函数parse_rate,并且可以根据需要对其进行自定义

代码语言:javascript
复制
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
代码语言:javascript
复制
'DEFAULT_THROTTLE_RATES': {
        'third_party_monthly': '3/30'
    }

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

票数 0
EN

Stack Overflow用户

发布于 2021-08-13 16:46:09

你可以这样做

代码语言:javascript
复制
from ratelimit.decorators import ratelimit
from http import HTTPStatus
代码语言:javascript
复制
@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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56876774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档