python - 如果我的程序返回溢出错误,如何让我的程序等待?
问题描述
所以我试图从一个最大调用限制为 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]
,我的程序将失败,并且使用该网站的任何人都不会看到任何内容。
解决方案
一般来说,像这样的情况,我建议在这里添加一层缓存间接。您绝对不希望(也不能)尝试像您建议的那样使用前端解决此问题,因为这不是您的应用程序前端的用途。当然,您可以添加“等待”功能,但所有人所要做的就是拉起 Chrome 开发人员工具来获取您的 API 密钥,然后根据需要多次调用它。可以这样想:假设您的厨师每小时只能煮 10 道菜。有人可以很容易地进入餐厅,点 10 样东西,然后在接下来的一个小时内没有其他人可以点任何东西,这是不公平的。相反,添加一个“缓存”层,这意味着您每隔几秒钟才调用一次 Steam API。如果有 5 个人在 5 秒内请求您的网站,您只需在第一次调用时转到 Steam API,然后保存该响应。对于其他 4 个(以及接下来几秒钟内出现的任何人),您返回一个“缓存”版本。
添加缓存 API 层的两个主要原因如下:
您将停止
key
从前端公开。您永远不想像这样直接向前端公开您的 API 密钥,因为任何人都可以获取您的密钥并运行许多请求,然后 bam,您的站点现在已关闭(拒绝服务攻击是微不足道的)。相反,您会让用户点击mysite.io/getLatestData
不需要密钥的自定义端点,因为它会安全地存储在您的后端。您不会遇到速率限制问题。本质上,如果您的缓存每分钟只访问一次 API,那么您将不会遇到任何用户由于 API 限制而无法访问您的站点的情况,因为它会将缓存结果返回给用户。
这可能有点难以想象,所以这是它的工作原理:
你用你最喜欢的服务器端语言编写了一个小 API。比方说 NodeJS。有很多资源可用于学习 ExpressJS 的基础知识。你会写一个这样的端点/getTopGame
,它附加到像redis这样的缓存上。如果 redis 缓存中有缓存条目,则将其返回给用户。如果没有,请转到 steam API 并获取最新数据。将其存储在 5 秒后到期。砰,你完成了!
一开始似乎有点令人生畏,但正如您所说,作为一名大学生,这是了解后端开发工作原理的好方法。
推荐阅读
- angular - 为什么在导入文本编码 polyfill 后在 IE11 中出现“ReferenceError: 'TextEncoder' is undefined”?
- vhdl - Altera Cyclone III 片上 ram 延迟
- sql - 存在失败进入存储过程
- kendo-grid - Kendo MVC Grid 第 8 列禁用其他列上的 MinScreenWidth 属性
- swift - 如何使用生成的访问器一对多的 NSManagedObject 类?
- linux - 从同一个 shell 调用时,跨多个应用程序实例保持会话
- ionic-framework - 浏览器 - 无法 XHR config.xml:未找到
- c++ - gtkmm:什么是 Glib::RefPtr 用例?
- c# - DataTable.Compute 使用什么比较器?
- python - 如何以正确的方式在 python 中使用 pathlib 排除路径目录中的文件?