django 使用“限制”可以限制全局发出某个请求的次数

y3bcpkx1  于 2023-01-03  发布在  Go
关注(0)|答案(2)|浏览(175)

我正在使用Django Throttling,并希望添加一个行为,该行为将限制用户调用某个请求的速率超过X倍-全局。
使用AnonRateThrottle或UserRateThrottle对我来说还不够好,因为它会检查某个用户或IP地址发出请求的次数。我希望将全局调用限制在某个API_view,无论是谁发出请求。
例如,如果速率为1/min,并且用户X发出请求,则在下一分钟内将对每隔一个用户进行节流。

jjhzyzn0

jjhzyzn01#

在这里,我为特定用户创建了Throttling

throttling.py

from rest_framework.throttling import UserRateThrottle

class RockyRateThrottle(UserRateThrottle):
 scope = 'rocky'

settings.py

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES':{
        'anon': '2/day',     # For Anonymous user
        'user': '5/hour',    # For Registred user
        'rocky': '3/minute'  # For register but specific user
    }
}

views.py

from rest_framework.throttling import AnonRateThrottle, UserRateThrottle
from api.throttling import RockyRateThrottle

class StudentModelViewSet(viewsets.ModelViewSet):
  queryset = Student.objects.all()
  serializer_class = StudentSerializer
  authentication_classes=[SessionAuthentication]
  permission_classes=[IsAuthenticatedOrReadOnly]
  #  throttle_classes = [AnonRateThrottle, UserRateThrottle]
  throttle_classes = [AnonRateThrottle, RockyRateThrottle] # this is working for 'anon' and 'Rocky'
jhdbpxl9

jhdbpxl92#

要对视图全局应用throttle,您可以使用相同的键。这里的想法是对每个视图使用相同的键。这意味着对于所有请求,它将使用相同的键来获取请求计数数据

from rest_framework import throttling

class MyViewRateThrottle(throttling.SimpleRateThrottle):
    rate = '3/m'

    def get_cache_key(self, request, view):
        return view.__name__

这将节流每个视图.相同的作为你正在寻找

相关问题