当前位置:首页微信公众平台推荐IT技术微信公众号Python程序员正文

Requests-cache缓存外部api请求

2017-02-19 Python程序员

微信扫一扫
分享到朋友圈

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

发现自己对外部API做同样的请求,使用完全相同的参数并返回完全相同的结果?如果是这样,那么您应该缓存此请求以限制HTTP请求的数量,以帮助提升性能。

让我们看一个使用requests包的例子。

Github API

Github仓库中获取代码(或下载zip文件),基本上,我们一遍遍地搜索Github API,通过位置和编程语言寻找类似的开发者。

现在,在初始搜索之后,如果用户再次搜索(例如,不更改参数),应用程序将执行完全相同的搜索,一次又一次地搜索Github API。这是一个昂贵的过程,会拖慢面向终端用户的应用的执行速度。另外,如此反复搜索几次,会很快降低我们的最大速率。

幸运的是,这样的问题很容易解决。

Requests-cache

为了实现缓存,我们可以使用一个叫Requests-cache的包,它是一个“透明持久缓存的包”。

请记住,您可以将此包与任何Python框架(而不仅仅是Flask)或脚本一起使用,只要将它与requests包结合使用即可。

从安装软件包开始:

然后在app.py中引入包以及同时使用install_cache()方法:

现在每当你使用requests,响应将被自动缓存。此外,您可以看到我们定义几个参数。注意expire_after参数,设置为180秒。由于Github API经常更新,我们希望确保提供最新的结果。因此,在初始缓存发生180秒后,请求将重新启动并缓存一组新的结果。以传输更新后的结果。

有关更多选项,请查看官方文档

因此,您的app.py文件现在应该如下所示:


测试!

启动应用程序并搜索开发人员。在“app”目录中,应该创建一个名为github_cache.sqlite的SQLite数据库。现在如果你继续搜索相同的地理位置和编程语言,requests实际上不会被调用。相反,它将使用来自SQLite数据库的缓存响应。

让我们确保缓存实际有效期。更新home()视图函数如下:

所以,这里我们只是使用from_cache属性来查看响应是否来自缓存。让我们来测试一下。尝试新的搜索。然后打开你的终端:

因此,您可以看到我们在13:34:25向Github API发出了初始请求,并且由于False输出到屏幕,因此未使用缓存。再次尝试搜索。

现在你可以看到使用缓存。再试几次。

因此,您可以看到缓存已过期,我们在13:37:59发出了一个新的API调用。之后,使用高速缓存。非常简单,对吧?

更改请求中的参数会发生什么?尝试一下。输入新位置和编程语言。这里发生了什么?对了,由于参数发生改变,Requests-cache把它当做一个不同的请求,没有使用缓存。

平衡 - 刷新 vs 性能

再次,在上面的示例中,我们在180秒后过期缓存(通常称为刷新),以便向终端用户提供最新的数据。想一下。是否真的有必要如此频繁地刷新它?也许不需要。如果在我们的API结果中偶尔不及时反应用户订阅情况的变化不是太大问题的话,我们就可以将程序的刷新时间设置为5或10分钟。也就是说,只有当数据对时间敏感,并且对程序的核心功能至关重要时,才需要把刷新的时间间隔设置得比较小。

例如,如果您从每分钟更新几次的API(如地震活动的API)中提取数据,并且终端用户必须拥有最新的数据,那么你可以每30或60秒左右刷新一次。

同样重要的是平衡刷新频率与调用所需时间。如果你的API调用相当昂贵 - 或许需要一到五秒 - 那么你可以增加刷新时间间隔(刷新频率)以此来提升性能。

结论

缓存是一个强大的技术。在这个案例中,我们通过限制外部HTTP请求的数量来提高应用程序的性能。我们从实际的HTTP请求本身中减少延迟。在很多情况下,还不只是做一个请求。还必须处理请求,这可能涉及到数据库,执行某种过滤等。因此,缓存也可以减少处理请求的延迟。

恭喜!

英文原文:http://realpython.com/blog/python/caching-external-api-requests/
译者:winston


原版阅读 加入收藏
分享给好友

相关标签:Requests api cache 缓存 请求 外部

回到顶部