예제 #1
0
    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())
예제 #2
0
 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)
예제 #3
0
 def _raiseRateLimitException(self, timeout, limitRate):
     raise exc.RateLimitExceeded(
         "Rate limit of {0} exceeded. Try again in {1} seconds.".format(
             limitRate, timeout))