1. 概览
1.1 REST framework
Django REST framework 是一个基于 Django 框架用于构建 Web APIs 的工具包。它包含了一些常用的 Web API 功能,例如:序列化、响应处理、请求解析和认证等。同时它还支持多种认证方式,例如:API 密钥、基本认证和 OAuth 等。
1.2 限流功能
在实际应用中,我们会发现有些 API 的请求量可能会很大,如果不进行限制很容易导致服务器宕机。限流功能就是为了避免这种情况的发生,它能够限制 API 请求的速度和数量,保证 API 的可用性和稳定性。
2. 限流方式
2.1 基于 IP 地址的限流
基于 IP 地址的限流是最简单的限流方式,它将相同 IP 地址的请求视为同一用户的请求。我们可以通过配置 Django 中的中间件来实现基于 IP 地址的限流。
具体做法是:
在 settings.py 文件中添加如下中间件:
MIDDLEWARE = [
# ...
'django.middleware.ipware.IPWareMiddleware',
# ...
'django.middleware.common.CommonMiddleware',
# ...
]
在 views.py 文件中添加如下装饰器:
from django.views.decorators.csrf import csrf_exempt
from ratelimit.decorators import ratelimit
@ratelimit(key='user', rate='5/h', block=True)
@csrf_exempt
def my_view(request):
# ...
以上代码将指定 5 个请求每小时以内不被阻止,如果超过限制则会被阻止,直到时限过了才会重新释放。
2.2 基于用户的限流
如果我们需要以用户为基础进行限流,我们需要在另外的表格中存储用户访问次数和时间信息,并在数据库中使用事务机制来确保数据整合性。这种限流方式能够更加精确地进行限制,但需要花费更大的时间和精力进行实现。
3. 参考
REST framework 中文文档:https://q1mi.github.io/Django-REST-framework-documentation-cn/topics/throttling.html
django-ratelimit 官方文档:https://django-ratelimit.readthedocs.io/en/latest/index.html