Package: tiriel-ratelimit
APIs are a very common way to interact with web services. As the need to
consume data grows, so does the number of API calls necessary to remain up to
date with data sources. However many API providers constrain developers from
making too many API calls. This is know as rate limiting and in a worst case
scenario your application can be banned from making further API calls if it
abuses these limits.This packages introduces a function decorator preventing a function from being
called more often than that allowed by the API provider. This should prevent
API providers from banning your applications by conforming to their rate
limits.InstallationPyPiAdd this line to your application’s requirements.txt:ratelimitAnd then execute:$pipinstall-rrequirements.txtOr install it yourself:$pipinstallratelimitGitHubInstalling the latest version from Github:$gitclonehttps://github.com/tomasbasham/ratelimit$cdratelimit$pythonsetup.pyinstallUsageTo use this package simply decorate any function that makes an API call:fromratelimitimportlimitsimportrequestsFIFTEEN_MINUTES=900@limits(calls=15,period=FIFTEEN_MINUTES)defcall_api(url):response=requests.get(url)ifresponse.status_code!=200:raiseException('API response:{}'.format(response.status_code))returnresponseThis function will not be able to make more then 15 API call within a 15 minute
time period.The arguments passed into the decorator describe the number of function
invocation allowed over a specified time period (in seconds). If no time period
is specified then it defaults to 15 minutes (the time window imposed by
Twitter).If a decorated function is called more times than that allowed within the
specified time period then aratelimit.RateLimitExceptionis raised. This
may be used to implement a retry strategy such as anexpoential backofffromratelimitimportlimits,RateLimitExceptionfrombackoffimporton_exception,expoimportrequestsFIFTEEN_MINUTES=900@on_exception(expo,RateLimitException,max_tries=8)@limits(calls=15,period=FIFTEEN_MINUTES)defcall_api(url):response=requests.get(url)ifresponse.status_code!=200:raiseException('API response:{}'.format(response.status_code))returnresponseAlternatively to cause the current thread to sleep until the specified time
period has ellapsed and then retry the function use thesleep_and_retrydecorator. This ensures that every function invocation is successful at the
cost of halting the thread.fromratelimitimportlimits,sleep_and_retryimportrequestsFIFTEEN_MINUTES=900@sleep_and_retry@limits(calls=15,period=FIFTEEN_MINUTES)defcall_api(url):response=requests.get(url)ifresponse.status_code!=200:raiseException('API response:{}'.format(response.status_code))returnresponseAdditionally a collection of exception classes can be passed as an argument to
the constructor. If the wrapped function raises any of these exceptions they
will we wrapped in aratelimit.RateLimitException. This allows the usage
of thesleep_and_retrydecorator functionality on arbitrary exceptions.fromratelimitimportlimits,sleep_and_retry@sleep_and_retry@limits(calls=1,period=10,wrap_exceptions=(RuntimeError,IOError))defraise_exception():raiseRuntimeError("Wrapped in RateLimitException")LicenseThis project is licensed under theMIT License.