频率的使用
# 限制访问次数(IP,用户id) # 限制同一个IP一分钟只能访问3次 # 使用步骤 -第一步:写一个类,继承SimpleRateThrottle,重写get_cache_key -第二步:get_cache_key返回什么就以什么做限制,必须写类属性 scope='字符串' -第三步:配置文件中配置 'DEFAULT_THROTTLE_RATES': { '字符串': '3/m', # key:ip_1m_3 对应频率类的scope属性, value: 3/m 一分钟访问3次 # m:分钟 # s:秒 # h:小时 # d:天 }, -第四步:局部使用和全局使用
auth.py 可以是任意的单独文件
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle class MyThrottling(SimpleRateThrottle): scope = 'ip_1m_3' # 必须写scope是一个字符串 def get_cache_key(self, request, view): # 返回什么,就以什么做限制(ip地址) # 客户端ip地址 return request.META.get('REMOTE_ADDR') # 以用户id限制 # return request.user.id
settings.py #配置文件 +全局使用
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.AuthLogin' ], 'DEFAULT_THROTTLE_RATES': { "ip_1m_3":"3/m" }, #配置文件,限制用户一分钟访问3次 'DEFAULT_THROTTLE_CLASSES': ['app01.auth.MyThrottling'], #全局使用 }
views.py #局部使用
class BookView(ModelViewSet): throttle_classes = [MyThrottling] #局部使用 authentication_classes = [] queryset = models.Book.objects.all() serializer_class = BookSerializer
1 频率
1.1 内置的频率限制(限制未登录用户)
# 全局使用 限制未登录用户1分钟访问3次 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'rest_framework.throttling.AnonRateThrottle', ), 'DEFAULT_THROTTLE_RATES': { 'anon': '3/m', } } ##############views.py from rest_framework.permissions import IsAdminUser from rest_framework.authentication import SessionAuthentication,BasicAuthentication class TestView4(APIView): authentication_classes=[] permission_classes = [] def get(self,request,*args,**kwargs): return Response('我是未登录用户') # 局部使用 from rest_framework.permissions import IsAdminUser from rest_framework.authentication import SessionAuthentication,BasicAuthentication from rest_framework.throttling import AnonRateThrottle class TestView5(APIView): authentication_classes=[] permission_classes = [] throttle_classes = [AnonRateThrottle] def get(self,request,*args,**kwargs): return Response('我是未登录用户,TestView5')
1.2 内置频率限制之,限制登录用户的访问频次
# 需求:未登录用户1分钟访问3次,登录用户一分钟访问5次 全局:在setting中 'DEFAULT_THROTTLE_CLASSES': ( 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle' ), 'DEFAULT_THROTTLE_RATES': { 'user': '5/m', 'anon': '3/m', } 局部配置: 在视图类中配一个就行
补充: