Как paginate через API-ответ асинхронно с Asyncio и Aiohttp - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь делать вызовы API с Python асинхронно.У меня есть несколько конечных точек в списке, и каждая конечная точка будет возвращать постраничные результаты.Я могу настроить асинхронное выполнение нескольких конечных точек, однако не могу вернуть разбитые на страницы результаты каждой конечной точки.

Из отладки я обнаружил, что функция fetch_more() запускает цикл while, но фактически не проходит асинхронно с помощью session.get ().Так в основном.Функция fetch_more() предназначена для получения оставшихся результатов от вызова API для каждой конечной точки, однако я считаю, что одинаковое количество результатов возвращается с или без функции fetch_more().Я пытался найти примеры нумерации страниц с помощью asyncio, но мне не повезло.

Насколько я понимаю, я не должен делать запрос внутри цикла while, однако я не уверен, что можно обойти это, чтобы получить постраничные результаты.

if __name__ == 'main':

    starter_fun(url, header, endpoints):

starter_func(url, header, endpoints):

    loop = asyncio.get_event_loop() #event loop
    future = asyncio.ensure_future(fetch_all(url, header, endpoints))
    loop.run_until_complete(future) #loop until done

async def fetch_all(url, header, endpoints):

    async with ClientSession() as session:
        for endpoint in endpoints:
           task = asyncio.ensure_future(fetch(url, header, endpoint))
           tasks.append(task)
        res = await asyncio.gather(*tasks) # gather task responses
        return res

async def fetch(url, header, endpoint): 

    total_tasks = []
    async with session.get(url, headers=header, params=params, ssl=False) as response:
        response_json = await response.json()
        data = response_json['key']
       tasks = asyncio.ensure_future(fetch_more(response_json, data, params, header, url, endpoint, session)) //this is where I am getting stuck
        total_tasks.append(tasks)
    return data


//function to get paginated results of api endpoint
async def fetch_more(response_json, data, params, header, url, endpoint, session): //this is where I am getting stuck

    while len(response_json['key']) >= params['limit']:
        params['offset'] = response_json['offset'] + len(response_json['key'])
        async with session.get(url, headers=header, params=params, ssl=False) as response_continued:
            resp_continued_json = await response_continued.json()
            data.extend(resp_continued_json[kebab_to_camel(endpoint)])
   return data

В настоящее время я получаю 1000 результатов с или без функции fetch_more, однако с fetch_more должно быть намного больше.Любая идея о том, как подходить к асинхронной нумерации страниц?

...