限速节流(Throttling):

使用drf可以给我们的网站API限速节流。比如一些爬虫,爬你网站的数据,那么我们可以通过设置访问的频率和次数来限制他的行为。

配置:

限速节流配置也是分成两种。第一种是直接在settings.REST_FRAMEWORK中设置,第二种是针对每个视图函数进行设置。配置分成两个,一个是throttle_classes,另外一个是throttle_rates。前者是配置不同的节流方式,后者是配置节流的策略。示例代码如下:

# settings.
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

# views.py
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = [UserRateThrottle]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

节流的类:

在drf中,节流的类总共有以下三个:

AnonRateThrottle:

针对那些没有登录的用户进行节流。默认会根据REMOTE_ADDR,也就是用户的IP地址作为限制的标记。如果用户使用了透明代理(匿名代理没法追踪),那么在X-Forwarded-For中会保留所有的代理的IP。比如下图:

Untitled

这时候就要看在settings.REST_FRAMEWORK.NUM_PROXIES了,如果这个值设置的是0,那么那么将获取

REMOTE_ADDR也就是真实的IP地址,如果设置的是大于0的数,那么将获取代理的最后一个IP。

UserRateThrottle:

根据用户的id来作为节流的标识。可以通过两种方式设置节流的策略。

  1. 在settings.REST_FRAMEWORK.DEFAULT_THROTTLE_RATES['user']设置。
  2. 自定义节流类,继承自UserRateThrottle,然后重写rate属性。

如果想要针对不同类型的用户实现不同策略的节流,我们可以通过继承UserRateThrottle类,然后设置scope属性,然后针对不同的scope设置不同的节流策略。比如针对管理员admin和普通用户normal,可以设置不同的策略。代码如下:

class AdminRateThrottle(UserRateThrottle):
    scope = 'admin'

class NormalRateThrottle(UserRateThrottle):
    scope = 'normal'

然后在settings.py中可以如下设置:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'example.throttles.AdminRateThrottle',
        'example.throttles.NormalRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'normal': '60/day',
        'admin': '1000/day'
    }
}