跳转到主要内容

为django提供速率限制

项目描述

django-ratelimiter

PyPI version CI codecov Python Versions license docs

使用 limits 为django提供速率限制。

文档: https://andriykohut.github.io/django-ratelimiter/

安装

pip install django-ratelimiter

用法

默认情况下,django-ratelimiter 将使用默认缓存。

Django配置

要使用非默认缓存,请在 settings.py 中定义 DJANGO_RATELIMITER_CACHE

# Set up django caches
CACHES = {
    "custom-cache": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
    }
}

# "default" cache is used if setting is not defined.
DJANGO_RATELIMITER_CACHE = "custom-cache"

可以通过定义 DJANGO_RATELIMITER_STORAGE 使用 limits 包提供的任何存储后端。

from limits.storage import RedisStorage

DJANGO_RATELIMITER_STORAGE = RedisStorage(uri="redis://localhost:6379/0")

有关存储的更多详细信息,请参阅 limits 文档

速率限制策略

视图装饰器

默认情况下,所有请求都将进行速率限制

from django_ratelimiter import ratelimit

@ratelimit("5/minute")
def view(request: HttpRequest) -> HttpResponse:
    return HttpResponse("OK")

选择一个速率限制策略,默认为 fixed-window

# options: fixed-window, fixed-window-elastic-expiry, moving-window
@ratelimit("5/minute", strategy="fixed-window-elastic-expiry")
def view(request: HttpRequest) -> HttpResponse:
    return HttpResponse("OK")

您可以使用请求属性键定义每个用户的限制。

@ratelimit("5/minute", key="user")
def view(request: HttpRequest) -> HttpResponse:
    return HttpResponse("OK")

可调用键可用于定义更复杂的规则

@ratelimit("5/minute", key=lambda r: r.user.username)
def view(request: HttpRequest) -> HttpResponse:
    return HttpResponse("OK")

仅对某些方法进行速率限制

@ratelimit("5/minute", methods=["POST", "PUT"])
def view(request):
    return HttpResponse("OK")

提供自定义响应

from django.http import HttpResponse

@ratelimit("5/minute", response=HttpResponse("Too many requests", status=400))
def view(request):
    return HttpResponse("OK")

使用非默认存储

from limits.storage import RedisStorage

@ratelimit("5/minute", storage=RedisStorage(uri="redis://localhost:6379/0"))
def view(request):
    return HttpResponse("OK")

中间件

对于更通用的情况,可以使用中间件而不是装饰器。

from typing import Optional

from django.http import HttpRequest

from django_ratelimiter.middleware import AbstractRateLimiterMiddleware


class RateLimiterMiddleware(AbstractRateLimiterMiddleware):
    def rate_for(self, request: HttpRequest) -> Optional[str]:
        # allow only 100 POST requests per minute
        if request.method == "POST":
            return "100/minute"
        # allow only 200 PUT requests per minute
        if request.methid == "PUT":
            return "200/minute"
        # all other requests are not rate limited
        return None

可以通过覆盖方法来自定义中间件,有关更多详细信息,请参阅API参考。

DRF/ninja/class-based views

django-ratelimiter 是框架无关的,它应该与 DRF/ninja 无需修改即可正常工作。类视图也支持使用 method_decorator

请参阅 test_app 中的示例。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

django_ratelimiter-0.2.2.tar.gz (6.1 kB 查看散列)

上传时间 源代码

构建分发

django_ratelimiter-0.2.2-py3-none-any.whl (8.1 kB 查看散列)

上传时间 Python 3

由以下组织支持