我正在使用Django 1.11和Python 2.7,现在尝试将限制包含在我的webservice中。一开始这看起来很容易,因为Django为你做了所有的工作。但现在我想只限制我的一个观点并区分经过身份验证的用户和登录用户以及设置“突发”速率(例如每分钟5个请求)和“持续”速率(例如每天100个请求)。
实现这一点,我建立了4个油门类:
class SustainedAnon(AnonRateThrottle):
rate = '100/day'
class BurstAnon(AnonRateThrottle):
rate = '6/minute'
class SustainedUser(UserRateThrottle):
rate = '1000/day'
class BurstUser(UserRateThrottle):
rate = '20/min'
我没有更改settings.py,因为根据文档(Django Throtte Docs)不需要它。我编辑的唯一文件是我的views.py,其中我将此行添加到Statistics类中
class Statistics(APIView):
throttle_classes = (SustainedAnon, BurstAnon, SustainedUser, BurstUser)
它几乎完成了应该做的事情。它只会对登录的Statistics类和限制器以及匿名用户进行单独限制,但它不会正确地限制速率。未登录时,应用程序会在3次请求后开始限制,而不是6次,并在10次请求后登录而不是20次。 我想这种情况正在发生,因为他在每个被调用的节流类中设置了cache-request-value(当没有登录时,SustainedAnon和BurstAnon)。 但是为什么会发生这种情况?我怎么能告诉django只能“扼杀一次”?
API可以同时具有多个UserRateThrottles。为此,请覆盖UserRateThrottle并为每个类设置唯一的“范围”。
这意味着你必须为你正在使用的每个UserRateThrottle
配置不同的范围。
请注意,这也适用于AnonRateThrottle
。