如果程序返回溢出错误,如何使程序等待?

时间:2019-07-18 05:42:48

标签: python get python-requests

因此,我正在尝试从最大调用限制为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']

因此它通常可以运行,但是如果它返回响应[200]以外的任何内容,则我的程序将失败,并且使用该网站的任何人都将看不到任何东西。

1 个答案:

答案 0 :(得分:0)

通常在这种情况下,我建议在此处添加一层缓存间接寻址。您绝对不希望(也不能)像您建议的那样尝试使用前端解决此问题,因为这不是您应用程序前端的目的。当然,您可以添加“等待”功能,但是所有人要做的就是拉起Chrome Developer工具来获取您的API密钥,然后根据需要多次调用它。这样想:假设您有一个厨师,每小时只能煮10道菜。有人可以轻松地进入餐厅,订购10件东西,然后其他人在接下来的一个小时内都不能订购任何东西,这是不公平的。而是添加一个“缓存”层,这意味着您仅每隔几秒钟调用一次Steam API。如果有5个人在5秒钟内请求您的网站,则仅在第一次调用时访问Steam API,然后保存该响应。对于其他4个用户(以及随后几秒钟内出现的所有用户),您将返回“已缓存”版本。

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

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

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

    < / li>

这可能很难看清楚,所以这是它的工作原理:

您使用自己喜欢的服务器端语言编写了一些API。假设是NodeJS。有很多资源可以学习ExpressJS的基础知识。您将编写一个像/getTopGame这样的终结点,并附加到一个像redis这样的缓存中。如果redis缓存中有一个缓存的条目,请将其返回给用户。如果没有,请转到Steam API并获取最新数据。存放时间为5秒。繁荣,您完成了!

乍一看似乎有些令人生畏,但是正如您所说的,作为一名大学生,这是一种学习很多后端开发工作原理的好方法。