django_Rest_framework状态的文档:
如果要同时施加突发节流率和持续节流率,也可以使用多个节气门。例如,您可能希望将用户限制为每分钟最多60个请求,每天最多1000个请求。
但是,没有说明如何实现这种情况。
我已经尝试过类似的方法,但是没有用
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': ['30/minute', '1000/day']
}
}
答案 0 :(得分:1)
有可能,但是有必要定义多个限制,每个时间单位一个。
首先,在设置中定义所需的所有限制,例如,每分钟不超过30,每天不超过1000。
.drawer {
background: green;
position: fixed;
z-index: 1;
top: 0;
bottom: 0;
width: 150px;
min-height: 100vh;
}
.drawer.left {
left: 0;
}
.drawer.right {
right: 0;
}
使用您定义的范围将Throttling类添加为UserRateThrottle的子类:
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user_min': '30/minute',
'user_day': '1000/day',
}
}
最后,在您设置为节流阀的APIView上,这些类将具有您在上一步中定义的限制。
class UserMinThrottle(UserRateThrottle):
scope = 'user_min'
答案 1 :(得分:0)
您没有UserRateThrottle
的费率列表。
根据documentation,您必须配置一个范围以允许多个费率。
在您的情况下,它将是:
class BurstRateThrottle(UserRateThrottle):
scope = 'burst'
class SustainedRateThrottle(UserRateThrottle):
scope = 'sustained'
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'example.throttles.BurstRateThrottle',
'example.throttles.SustainedRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'burst': '60/min',
'sustained': '1000/day'
}
}
答案 2 :(得分:0)
这是一个很好的问题,由于我只想对我的ViewSet的一个方法(在我的情况下为create / POST)应用多个节流阀,所以情况就更加复杂了。
因此,我首先想出了如何仅对ViewSets中的特定方法应用节流阀,然后发现了这篇文章:http://www.pedaldrivenprogramming.com/2017/05/throttling-django-rest-framwork-viewsets/
并且由于ViewSet
继承了APIView
,所以我做到了,所以我将添加 APIView
throttle_classes
列表。
import myprojectname.throttles as throttles # throttles.py
class MyFooViewSet(viewsets.ViewSet):
# Only throttle specific methods
def get_throttles(self):
if self.action in ['create']:
# Apply these throttle classes
self.throttle_classes.append(throttles.FooThrottleBurst)
self.throttle_classes.append(throttles.FooThrottleSustained)
# ...
throttles.py 看起来像这样(没什么特别的,就像https://www.django-rest-framework.org/api-guide/throttling/#userratethrottle)
from rest_framework.throttling import UserRateThrottle
class FooThrottleBurst(UserRateThrottle):
scope = 'mynamespace.burst'
class FooThrottleSustained(UserRateThrottle):
scope = 'pricereport.sustained'
这些费率当然是在settings.py中定义的:
# ... some example values
'mynamespace.burst': '3/minute',
'mynamespace.sustained': '5/hour',
# ...
与Postman进行测试后,我在一分钟内可以成功完成3个POST(4个明显受到限制)。等待约60秒并提出新请求后,应用了“持续的”节流规则(每小时5次),DRF向我返回了此消息:
{
"detail": "Request was throttled. Expected available in 3538 seconds."
}
我不了解OP的情况,但我想分享我的方法