目录框架
框架中限流功能的实现依赖于封装好的限流类,设置方式上分为全局设置和局部设置、继承类设置和自定义类设置。若是要实现限流功能则必须设置DEAFULRT_THROTTLE_CLASSES和DEAFULRT_THROTTLE_RATES函数
wait方法主要功能是返回距离下次能够正常访问的时间,注意返回值必须是数值,不能是字符串,基本思路是:须要用当前时间减去被剔除的访问时间获得的是刚过去多少时间,用限制的总时间再减去这个时间便可获得剩余限制时间。测试
Note
须要注意两点:
- 自定义的限流类中必须包含allow_request和wait方法,这两个方法名不能写错,不然系统没法运行。
- 获取IP地址的方法有两种:
- 方式一: remote_addr = request._request.META.get('REMOTE_ADDR')
- 方式二: remote_addr = request.META.get('REMOTE_ADDR')
自定义限流类代码:url
# 设置同一个IP一分钟内只能访问三次的限流功能 import time VISIT_RECORD = {} class VisitThrottle(object): def __init__(self): self.history = None self.ctime = None self.time = None # 变量默认为空 def allow_request(self, request, view): remote_addr = request._request.META.get('REMOTE_ADDR') # 获取用户IP # 若是继承基类,那么这个remote_addr = self.get_indent(request),直接调用继承类中的方法 ctime = time.time() self.ctime = ctime # 获取当前时间 if not remote_addr in VISIT_RECORD: VISIT_RECORD[remote_addr] = [ctime,] # 不存在记录,建立记录 history = VISIT_RECORD.get(remote_addr) self.history = history while history and history[-1] < ctime - 60: history.pop() # 距离当前时间超过一分钟的回自动剔除 if len(history) <= 3: history.insert(0, ctime) return True #返回True表示能够继续访问 def wait(self): self.time = 60 - (self.ctime - self.history[-1]) return self.time # 直接返回时间
--settings.py REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':[ 'rest_framework.throttling.AnonRateThrottle', # 匿名用户的限流 'rest_framework.throttling.UserRateThrottle' # 注册用户的限流 } 'DEFAULT_THROTTLE_RATES': { 'anon': '2/minute', # 匿名用户每分钟限制访问次数为5次 'user': '5/minute', # 注册用户每分钟限制访问次数为15次 } --views.py # 全局限流功能的实现 class Demo5APIView(APIView): # 全局设置不须要在视图类中进行操做 def get(self, request): # 投票页面 return Response('这是投票页面') --urls.py urlpatterns = [ path('demo7/',views.Demo7APIView.as_view()), ]
--settings.py REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES': { 'anon': '2/minute', # 匿名用户每分钟限制访问次数为5次 'user': '5/minute', # 注册用户每分钟限制访问次数为15次 } } --views.py # 局部限流功能的实现 class Demo6APIView(APIView): throttle_classes = [UserRateThrottle, AnonRateThrottle] # 局部设置须要写在视图函数中,以列表的形式来设置 def get(self, reqeust): return Response('测试局部限流功能') --urls.py urlpatterns =[ path('demo6/', views.Demo6APIView.as_view()), ]
--settings.py 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.ScopedRateThrottle', # 自定义限流须要用到的类 ], 'DEFAULT_THROTTLE_RATES': { 'contacts': '5/hour', # 自定义限流的速率设置 } }
--views.py from rest_framework.throttling import ScopedRateThrottle class Demo7APIView(APIView): throttle_scope = 'contacts' # 经过throttle_scope来设置限流速率名称 def get(self, request): return Response("测试自定义限流功能") -- urls.py urlpatterns = [ path('demo7/', views.Demo7APIView.as_view()), ]