def __call__(self, args): """ Register another request is being issued. Depending on configuration of the rule will pause if rate limit has been reached, or raise exception, etc. """ # First check if the deque is full; that indicates that we'd better check whether # we need to pause. if len(self.tab) == self.requests: # Grab the oldest (leftmost) timestamp and check to see if it is greater than 1 second delta = datetime.now() - self.tab[0] if delta < self.timeframe: # Has it been less than configured timeframe since oldest request? if self.raise_exc: raise exc.RateLimitExceeded( "Rate limit exceeded (can try again in {0})".format( self.timeframe - delta)) else: # Wait the difference between timeframe and the oldest request. td = self.timeframe - delta sleeptime = hasattr(td, 'total_seconds') and td.total_seconds( ) or total_seconds(td) self.log.debug( "Rate limit triggered; sleeping for {0}".format( sleeptime)) time.sleep(sleeptime) self.tab.append(datetime.now())
def _raise_rate_limit_exception(self, timeout, limit_rate): raise exc.RateLimitExceeded("Rate limit of {0} exceeded. " "Try again in {1} seconds.".format( limit_rate, timeout), limit=limit_rate, timeout=timeout)
def _raiseRateLimitException(self, timeout, limitRate): raise exc.RateLimitExceeded( "Rate limit of {0} exceeded. Try again in {1} seconds.".format( limitRate, timeout))