【问题标题】:Setting up two throttle rates in one view in django在 django 的一个视图中设置两个油门速率
【发布时间】:2018-06-02 20:05:22
【问题描述】:

我正在使用 Django 1.11 和 Python 2.7,现在尝试将 throttling 包含到我的 web 服务中。刚开始这似乎很容易,因为 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,我在其中将这一行添加到我的统计类

class Statistics(APIView):
    throttle_classes = (SustainedAnon, BurstAnon, SustainedUser, BurstUser)

它几乎完成了它应该做的事情。它只限制统计类并分别限制登录和匿名用户,但它不会正确限制速率。 未登录时,应用程序在 3 个请求而不是 6 个请求后开始节流,在 10 个请求而不是 20 个请求后登录时开始限制。
我猜这是因为他在每个被调用的节流类中设置了缓存请求值(当未登录时,SustainedAnon 和 BurstAnon)..
但是为什么会发生这种情况,我怎么能告诉 django 只“节流一次”?

【问题讨论】:

    标签: python django rest django-rest-framework throttling


    【解决方案1】:

    documentation 声明:

    一个 API 可能同时有多个 UserRateThrottle。 为此,请覆盖 UserRateThrottle 并为每个设置一个唯一的“范围” 类。

    这意味着您必须为您正在使用的每个UserRateThrottle 配置不同的范围。

    请注意,这也适用于AnonRateThrottle。

    【讨论】:

    • 我已经试过了,效果很好,但似乎不可能将两个范围添加到一个视图,所以我不能只限制一个视图,对吧?
    • 当然可以。 django-rest-framework.org/api-guide/throttling/… 告诉您如何对一个视图进行特定限制。
    猜你喜欢
    • 2018-10-12
    • 2018-01-27
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多