本文共 2710 字,大约阅读时间需要 9 分钟。
可以对接口访问的频次进行限制,以减轻服务器压力。
一般用于付费购买次数,投票等场景使用.
可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES
和 DEFAULT_THROTTLE_RATES
进行全局配置,
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'rest_framework.throttling.AnonRateThrottle', #匿名用户,未登录的 'rest_framework.throttling.UserRateThrottle' #经过登录之后的用户 ), 'DEFAULT_THROTTLE_RATES': { 'anon': '100/day', 'user': '1000/day' }}
DEFAULT_THROTTLE_RATES
可以使用 second
, minute
, hour
或day
来指明周期。
源码:{'s': 1, 'm': 60, 'h': 3600, 'd': 86400} m表示分钟,可以写m,也可以写minute
也可以在具体视图中通过throttle_classess属性来配置,如
from rest_framework.throttling import UserRateThrottlefrom rest_framework.views import APIViewclass ExampleView(APIView): throttle_classes = (UserRateThrottle,) #局部配置 ...
1) AnonRateThrottle
限制所有匿名未认证用户,使用IP区分用户。
使用DEFAULT_THROTTLE_RATES['anon']
来设置频次
2)UserRateThrottle
限制认证用户,使用User id 来区分。
使用DEFAULT_THROTTLE_RATES['user']
来设置频次
3)ScopedRateThrottle (待定…)
限制用户对于每个视图的访问频次,使用ip或user id,先找的用户id,没有设置用户id的话就会使用ip地址。
例如: 全局
class ContactListView(APIView): throttle_scope = 'contacts' ...class ContactDetailView(APIView): throttle_scope = 'contacts' ...class UploadView(APIView): throttle_scope = 'uploads' ...REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'rest_framework.throttling.ScopedRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'contacts': '1000/day', 'uploads': '20/day' }}
全局配置中设置访问频率
'DEFAULT_THROTTLE_RATES': { 'anon': '3/minute', 'user': '10/minute' }
from rest_framework.authentication import SessionAuthenticationfrom rest_framework.permissions import IsAuthenticatedfrom rest_framework.generics import RetrieveAPIViewfrom rest_framework.throttling import UserRateThrottleclass StudentAPIView(RetrieveAPIView): queryset = Student.objects.all() serializer_class = StudentSerializer authentication_classes = [SessionAuthentication] permission_classes = [IsAuthenticated] throttle_classes = (UserRateThrottle,)
ScopedRateThrottle局部使用示例
settings.py内容'DEFAULT_THROTTLE_RATES': { 'xx': '3/minute', 'oo': '5/minute', }, views.py内容from rest_framework.throttling import ScopedRateThrottleclass StudentAPIView(ListAPIView): queryset = models.Student.objects.all() serializer_class = StudentModelSerializer throttle_classes = [ScopedRateThrottle,] throttle_scope = 'xx'class StudentAPI2View(ListAPIView): queryset = models.Student.objects.all() serializer_class = StudentModelSerializer throttle_classes = [ScopedRateThrottle, ] throttle_scope = 'oo' urls.py内容 path(r'students/',views.StudentAPIView.as_view()), path(r'students2/',views.StudentAPI2View.as_view()),
转载地址:http://tgqzi.baihongyu.com/