"""
__title__ = ''
__author__ = ''
__mtime__ = ''
"""
import logging
import time
from rest_framework.throttling import SimpleRateThrottle
logger = logging.getLogger('mylogger')
class VisitThrottleMixin(object):
'''
根据Django-rest-framework的限流原理改写,根据滚动时间分片限流,应对瞬时高并发
有一定的局限性
作者:
'''
MAX_CAPACITY = 1
TIME_DELTA = 60
def __init__(self):
self.history = None
self.__visit_key = '__visit_throttle_key'
def allow_request(self, request, view):
mehtod = request.method
uri_name = request.path_info
if mehtod == "POST" and uri_name == "/xxx/xxx/":
ctime = time.time()
if self.__visit_key not in request.session:
request.session[self.__visit_key] = [ctime, ]
return True
history = request.session.get(self.__visit_key)
self.history = history
while history and history[-1] < (ctime - self.TIME_DELTA):
history.pop()
if len(history) < self.MAX_CAPACITY:
history.insert(0, ctime)
request.session[self.__visit_key] = history
return True
return False
else:
return True
def wait(self):
'''还需要等多久才能访问'''
ctime = time.time()
return self.TIME_DELTA - (ctime - self.history[-1])
VISIT_RECORD = {}
class VisitThrottle(object):
MAX_CAPACITY = 1
TIME_DELTA = 60
def __init__(self):
self.history = None
def allow_request(self, request, view):
if request.META.get('HTTP_X_FORWARDED_FOR'):
remote_addr = request.META.get("HTTP_X_FORWARDED_FOR")
else:
remote_addr = request.META.get('REMOTE_ADDR')
ctime = time.time()
if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime, ]
return True
history = VISIT_RECORD.get(remote_addr)
self.history = history
while history and history[-1] < ctime - self.TIME_DELTA:
history.pop()
if len(history) < self.MAX_CAPACITY:
history.insert(0, ctime)
return True
def wait(self):
ctime = time.time()
return self.TIME_DELTA - (ctime - self.history[-1])