限流(Throttling)是一种通过限制客户端对服务器资源的访问频率来减轻服务器压力的方法,常用于需要控制访问频次的场景,如付费购买、投票系统等。Django REST Framework(DRF)提供了内置的限流机制,可以方便地在项目中实现此功能。
基本配置
在DRF中,可以通过配置文件中的 DEFAULT_THROTTLE_CLASSES
和 DEFAULT_THROTTLE_RATES
来设置全局的限流策略。
REST_FRAMEWORK = {
# 全局限流配置类
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle', # 针对匿名未认证用户的限流
'rest_framework.throttling.UserRateThrottle', # 针对已认证用户的限流
],
'DEFAULT_THROTTLE_RATES': { # 访问频率配置
'anon': '2/day', # 游客每天限2次访问
'user': '5/day', # 已认证用户每天限5次访问
}
}
在 DEFAULT_THROTTLE_RATES
中,访问频率可以通过 second
、minute
、hour
或 day
来设定。例如,每天、每小时、每分钟、每秒钟的访问次数限制。
局部限流配置
除了全局配置外,还可以在特定的视图中通过 throttle_classes
属性来进行限流配置。例如:
from rest_framework.throttling import UserRateThrottle
from rest_framework.viewsets import ModelViewSet
class Student2ModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
throttle_classes = [UserRateThrottle] # 使用用户限流
在这个例子中,Student2ModelViewSet
视图中配置了 UserRateThrottle
,即使在全局配置中没有指定,仍会根据全局的 DEFAULT_THROTTLE_RATES
设定的频率限制来控制访问。
可选的限流类
DRF 提供了几种内置的限流类:
- AnonRateThrottle
-
- 限制所有匿名未认证用户的访问频率。通常使用 IP 地址来区分不同的用户。
- 使用
DEFAULT_THROTTLE_RATES['anon']
配置访问频率。
- UserRateThrottle
-
- 限制已认证用户的访问频率。通过用户的
id
主键来区分不同的用户。 - 使用
DEFAULT_THROTTLE_RATES['user']
配置访问频率。
- 限制已认证用户的访问频率。通过用户的
- ScopedRateThrottle
-
- 限制用户对特定视图的访问频率。可以基于 IP 或用户 ID。
- 通过
throttle_scope
属性指定特定视图的频率限制。
自定义限流配置
如果需要为特定用户组或访问类型定义不同的限流策略,可以结合 ScopedRateThrottle
进行自定义。例如:
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.ScopedRateThrottle', # 使用ScopedRateThrottle来实现自定义限流
],
'DEFAULT_THROTTLE_RATES': {
'anon': '2/day', # 游客访问频率
'user': '5/day', # 普通用户访问频率
'vip': '10/day', # VIP用户访问频率
}
}
在视图中可以指定 throttle_scope
来应用特定的限流策略:
from rest_framework.viewsets import ModelViewSet
class Student2ModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
throttle_scope = "vip" # 适用于VIP用户的限流
通过这种配置方式,可以灵活地管理不同用户群体或不同操作的访问频率,有效地减少服务器压力并优化资源利用。