我如何遍历nextToken

时间:2019-02-02 03:17:45

标签: python-3.4 boto3

我只种了如何在boto3使用的nextToken。我正在进行的API调用预计应该包含300个条目。我只有100。我知道我需要遍历下一个令牌,但是我在如何做到这一点上苦苦挣扎。我是python军队的新手。

def myservers():

  response = client.get_servers(maxResults=100,)
  additional = client.get_servers(nextToken=response['nextToken'])

这个小小的剪报会给我前50个加上第一个“ nextToken”,总共给我100个项目。显然,我需要一遍又一遍地迭代才能得到其余的内容。我希望有300多个物品。

3 个答案:

答案 0 :(得分:0)

我在这里使用了建议:

https://github.com/boto/botocore/issues/959#issuecomment-429116381

您必须继续调用传入NextToken的client.get_servers()。

答案 1 :(得分:0)

我只会做一个简单的while循环:

response = client.get_servers()
results = response["serverList"]
while "NextToken" in response:
    response = client.get_servers(NextToken=response["NextToken"])
    results.extend(response["serverList"])

答案 2 :(得分:0)

派生自 answer @Luke mentioned,这是一个使用 nextToken 调用任何方法的简单方法

def get_all_boto_records(method, args_dict, response_to_list):
    all_records = []
    extraArgs = {**args_dict}

    while True:
        resp = method(**extraArgs)

        all_records += response_to_list(resp)
        if "nextToken" in resp:
            extraArgs["nextToken"] = resp["nextToken"]
        else:
            break
    return all_records

使用方法如下:

all_log_records = get_all_boto_records(
    client.filter_log_events,
    {
        "logGroupName": "",
        "filterPattern": "",
    },
    lambda x: x["events"],
)

另一个很好的例子,用另一种方法来获取日志组

all_log_groups = get_all_boto_records(
    client.describe_log_groups,
    {"logGroupNamePrefix": f"/aws/lambda/{q}"},
    lambda x: x["logGroups"],
)