API速率限制修饰符

deckar01-ratelimit的Python项目详细描述


这个项目是tomasbasham/ratelimit的分支 实现sliding log 为了正确性,并通过sqlite提供持久性。请参阅上的“用法”部分 Persistence了解更多详细信息。开启持久性是非常重要的 建议,尤其是在开发期间,以确保遵守费率限制 在应用程序重新启动之间。在

api是与web服务交互的一种非常常见的方式。因为需要 消费数据不断增长,需要保持在 数据源的日期。然而,许多API提供者限制开发人员 进行太多API调用。这就是所谓的速率限制,在最坏的情况下 如果可以禁止应用程序进一步调用API 滥用这些限制。在

这个包引入了一个函数修饰符来防止函数 调用频率超过API提供程序允许的次数。这应该可以防止 API供应商禁止你的应用程序通过遵守他们的费率 限制。在

安装

PyPi

将此行添加到应用程序的要求.txt公司名称:

deckar01-ratelimit

然后执行:

^{pr2}$

或者自己安装:

$ pip install deckar01-ratelimit

GitHub

从Github安装最新版本:

$ git clone https://github.com/deckar01/ratelimit
$ cd ratelimit
$ python setup.py install

使用

要使用此包,只需装饰任何进行API调用的函数:

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))returnresponse

此函数将无法在15分钟内进行超过15次的API调用 时间段。在

传入decorator的参数描述函数的数量 允许在指定的时间段(以秒为单位)进行调用。如果没有时间段 则默认为15分钟(由 推特)。在

如果一个修饰函数被调用的次数超过了 指定时间段,则引发ratelimit.RateLimitException。这个 可用于实现重试策略,如expoential backoff

fromratelimitimportlimits,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))returnresponse

或者使当前线程休眠到指定的时间 句点已结束,然后使用^{tt2}重试函数$ 装饰工。这样可以确保在 停止线程的成本。在

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))returnresponse

持续性

如果在应用程序重新启动或共享之间需要遵守限制 在多个进程中,storage参数可用于保存限制 状态到磁盘并自动加载。在

fromratelimitimportlimits,sleep_a_retryimportrequestsFIFTEEN_MINUTES=900@sleep_and_retry@limits(calls=15,period=FIFTEEN_MINUTES,storage='ratelimit.db')defcall_api(url):response=requests.get(url)ifresponse.status_code!=200:raiseException('API response: {}'.format(response.status_code))returnresponse

如果需要持久化多个限制,name参数可用于 使用不同的表将它们存储在同一个数据库中。在

fromratelimitimportlimits,sleep_a_retryimportrequestsHOUR=3600DAY=24*HOUR@sleep_and_retry@limits(calls=15,period=HOUR,storage='ratelimit.db',name='hourly_limit')@sleep_and_retry@limits(calls=100,period=DAY,storage='ratelimit.db',name='daily_limit')defcall_api(url):response=requests.get(url)ifresponse.status_code!=200:raiseException('API response: {}'.format(response.status_code))returnresponse

许可证

{a5}是这个项目的许可证。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在OSGi felix scr注释中将运行时参数传递给服务   java如何按字母顺序将对象插入ArrayList?   在Netbeans中调试Java   java从json文件中获取不同的照片   通过迭代和打印将java插入2个哈希表的运行时间   java如何替换JUnit 5中的WireMock@Rule注释?   shell在javajsch程序中使用'been'命令访问受限目录   java RMI是什么类型的?   javajooq别名构造   java如何通过在testNG中创建对象来调用测试方法   java下载从安卓 URL加载到imageview中的图像   从java运行bat文件   带有客户端证书的java嵌入式Jetty   java Ajax将JSON数组发送到servlet   创建数据并将数据添加到SQLite数据库时发生java错误   添加CV的javascript HRMS项目过程   java AspectJ加载时编织不起作用   java动态更改(使用JMX)正在监视的文件夹中的新文件   java岛数迭代矩阵并将节点标记为已访问