首页 > 解决方案 > 如果我的程序返回溢出错误,如何让我的程序等待?

问题描述

所以我试图从一个最大调用限制为 60/min 的 API 获取数据。如果我对此进行处理,它将返回[429]太多请求的响应。

我认为也许更好的方法是继续请求 API,直到我得到响应[200],但我不确定如何执行此操作。

import requests

r = requests.get("https://api.steampowered.com/IDOTA2Match_570/GetTopLiveGame/v1/?key=" + key + "&partner=0")

livematches = json.loads(r.text)['game_list']

所以通常它会运行,但如果它返回除了 response 之外的任何内容[200],我的程序将失败,并且使用该网站的任何人都不会看到任何内容。

标签: pythongetpython-requests

解决方案


一般来说,像这样的情况,我建议在这里添加一层缓存间接。您绝对不希望(也不能)尝试像您建议的那样使用前端解决此问题,因为这不是您的应用程序前端的用途。当然,您可以添加“等待”功能,但所有人所要做的就是拉起 Chrome 开发人员工具来获取您的 API 密钥,然后根据需要多次调用它。可以这样想:假设您的厨师每小时只能煮 10 道菜。有人可以很容易地进入餐厅,点 10 样东西,然后在接下来的一个小时内没有其他人可以点任何东西,这是不公平的。相反,添加一个“缓存”层,这意味着您每隔几秒钟才调用一次 Steam API。如果有 5 个人在 5 秒内请求您的网站,您只需在第一次调用时转到 Steam API,然后保存该响应。对于其他 4 个(以及接下来几秒钟内出现的任何人),您返回一个“缓存”版本。

添加缓存 API 层的两个主要原因如下:

  1. 您将停止key从前端公开。您永远不想像这样直接向前端公开您的 API 密钥,因为任何人都可以获取您的密钥并运行许多请求,然后 bam,您的站点现在已关闭(拒绝服务攻击是微不足道的)。相反,您会让用户点击mysite.io/getLatestData不需要密钥的自定义端点,因为它会安全地存储在您的后端。

  2. 您不会遇到速率限制问题。本质上,如果您的缓存每分钟只访问一次 API,那么您将不会遇到任何用户由于 API 限制而无法访问您的站点的情况,因为它会将缓存结果返回给用户。

这可能有点难以想象,所以这是它的工作原理:

你用你最喜欢的服务器端语言编写了一个小 API。比方说 NodeJS。有很多资源可用于学习 ExpressJS 的基础知识。你会写一个这样的端点/getTopGame,它附加到像redis这样的缓存上。如果 redis 缓存中有缓存条目,则将其返回给用户。如果没有,请转到 steam API 并获取最新数据。将其存储在 5 秒后到期。砰,你完成了!

一开始似乎有点令人生畏,但正如您所说,作为一名大学生,这是了解后端开发工作原理的好方法。


推荐阅读