如何在 Django 中使用 URL 包装器来限制访问速率?

2023-04-11 00:00:00 速率 访问 如何在

要在 Django 中使用 URL 包装器来限制访问速率,可以使用 Django 的 ratelimit 库。这个库提供了一个装饰器 ratelimit(key, rate, block=False),可以限制指定时间间隔内请求的次数。

具体实现方法如下:

首先,安装 ratelimit 库:

pip install django-ratelimit

然后,在 settings.py 文件中添加 'ratelimit'INSTALLED_APPS 列表中:

# settings.py

INSTALLED_APPS = [
    # ...
    'ratelimit',
    # ...
]

接下来,在视图函数或类视图中使用 ratelimit 装饰器,指定限制条件,例如:

# views.py

from ratelimit.decorators import ratelimit

@ratelimit(key='user', rate='10/h', block=True)
def my_view(request):
    # ...

上面的示例中,key 参数指定了限制条件的键,可以是 IP 地址、用户名等,用于识别请求方。rate 参数指定了限制条件,例如 10/h 表示该限制条件下每小时只允许请求 10 次。block 参数指定当超出限制条件时是否禁止访问,默认为 False,如果为 True,则会返回 HTTP 429 Too Many Requests 状态码。

需要注意的是,ratelimit 装饰器只能限制在同一进程内的请求,如果要限制全局的请求速率,可以考虑使用相关的 CDN 服务或者反向代理服务器。

完整的示例代码如下:

# views.py

from django.shortcuts import render
from ratelimit.decorators import ratelimit

@ratelimit(key='user', rate='10/h', block=True)
def index(request):
    return render(request, 'index.html', {'message': 'Welcome to pidancode.com!'})
# urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

在上面的示例中,访问网站时,只允许每个用户每小时最多请求 10 次,超过限制会返回 HTTP 429 状态码。

相关文章