为django提供速率限制
项目描述
django-ratelimiter
使用 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 文档。
速率限制策略
- 固定窗口
- 具有弹性过期的固定窗口
- 移动窗口 - 仅通过设置
DJANGO_RATELIMITER_STORAGE
支持与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.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | e2638380df6cdb9ace0f06fb5a8add53c1e98465769189fb95be0d5994f76ef5 |
|
MD5 | 19a110619deae940d8a384fb69fdf4f5 |
|
BLAKE2b-256 | 1ed9fc974d2c80154593d2b0006861d4076ef5e2c30673665e8a6782ad233a41 |
关闭
django_ratelimiter-0.2.2-py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | fc1141d889be033c42cccb414cf3d37b1f4ed01b51a4b3e56181e3d5ec93c333 |
|
MD5 | 575a9fbf7eb148afef2d23c9b20bfd03 |
|
BLAKE2b-256 | a6427f55a000c5fb403e0e1814d1c88d15691b2f7432e74f13b033c487bdcadd |