【问题标题】:How to monitor API throttling in Django如何在 Django 中监控 API 节流
【发布时间】:2019-10-30 17:55:15
【问题描述】:

我正在构建一个解决方案,其中我有一个核心 API,我根据官方文档 https://www.django-rest-framework.org/api-guide/throttling/ 在该 API 上实现了节流。但我想知道我怎么能monitor the requests so that no genuine user of the app gets blocked and if so should be able to unblock it.

我的 settings.py 文件

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'students': '1/minute',
    }
}

我的意见.py

class StudentViewSet(viewsets.ModelViewSet):
    throttle_scope = 'students'

【问题讨论】:

  • 这里的正版用户是什么意思?它是开放式 API 吗?
  • genuine user 我的意思是一个只想使用 API 的人,而不是一些试图通过暴力攻击或其他方式破坏我的系统的机器人/机器/人。
  • 它是开放式 API 吗?
  • 是的,它是一个开放的 API。
  • 因此,仅通过查看请求无法知道请求是否真实。它将提供什么类型的信息?是静态信息吗?它多久会改变一次?在哪个用例中我们经常需要这些信息?这个可以缓存吗?

标签: python django django-rest-framework throttling


【解决方案1】:

Django REST framework 提供的限制类不允许您这样做。您必须创建一个自定义限制类并覆盖 allow_request() 以记录限制事件并为白名单提供一些便利。例如。像这样:

class WhitelistScopedRateThrottle(throttling.ScopedRateThrottle):

    def allow_request(self, request, view):
        allowed = super().allow_request(request, view)
        if not allowed:
            if self.is_whitelisted(request, view)
                return True
            else:
                self.log_throttling(request, view)
                return False
         else:
            return True

    def is_whitelisted(self, request, view):
        ...

    def log_throttling(self, request, view):
        ...

如何最好地实施白名单和日志记录取决于您的具体要求。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2020-03-27
    • 2019-09-22
    • 2017-08-26
    • 1970-01-01
    • 2020-10-24
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多