1. 程式人生 > >framework —— throttles(訪問頻率控制)

framework —— throttles(訪問頻率控制)

not args nbsp hid response ret djang ews pre

framework —— throttles(訪問頻率控制)

1.目錄結構

  技術分享圖片

2.views.py

技術分享圖片
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
# Create your views here.

RECORD = {
    # "1.1.1.1":[150131516161,]
}

class MyThrottle(object):
    def allow_request(self, request, view):
        
""" Return `True` if the request should be allowed, `False` otherwise. a.對匿名用戶進行限制:每個用戶1分鐘允許訪問10次 1.獲取用戶ip,在request裏面。 2.拿到之後,對它進行限制 3.怎麽限制? 用一個字典來約束限制 4.如果ip不在字典,就表示新增加的,就加到字典裏,以ip為key,時間戳為value。 5.約束條件:一分鐘以內的保留,一分鐘以外的剔除 6.添加時間戳之前限制。判斷,加約束條件。 7.約束條件做完,需要加個長度的約束,長度限制為10 8.當前時間還需要和最後的時間做個比較,求出等待時間 放回 false 限制 返回 true 通行
""" import time ctime = time.time() ip = "1.1.1.1" if ip not in RECORD: #如果不在就表示新添加的ip。 RECORD[ip] = [ctime,] else: #time_list = [4505461651651,3505461651651,2505461651651,1505461651651,] time_list = RECORD[ip] while
True: val = time_list[-1] #拿到最後一個值 if (ctime-60) > val: #時間尾端大於最後一個值 time_list.pop() #最後一個給剔除 else: #否則正常運行 break if len(time_list) >10 : return False time_list.insert(0,ctime) #添加時間戳,之前需要做判斷,加約束條件 return True def wait(self): import time ctime = time.time() first_out_time = RECORD[1.1.1.1][-1] #取到最後一個時間 wt = 60 - (ctime - first_out_time) #60秒- (當前時間-第一個出來時間) return wt class LimitView(APIView): authentication_classes = [] permission_classes = [] throttle_classes = [MyThrottle,] def get(self,request,*args,**kwargs): self.dispatch return Response(控制訪問頻率示例)
view.py

3.urls.py,(只需要添加標紅的)

技術分享圖片

驗證圖:

  技術分享圖片

framework —— throttles(訪問頻率控制)