Search code examples
python-3.xasync-awaitpython-asyncioaiohttp

Python asynchronous function calls using aiohttp


I am trying to understand aiohttp a little better. Can someone check why my code is not printing the response of the request, instead it just prints the coroutine.

import asyncio
import aiohttp
import requests

async def get_event_1(session):
    url = "https://stackoverflow.com/"
    headers = {
        'content-Type': 'application/json'
    }
    response = await session.request('GET', url)
    return response.json()

async def get_event_2(session):
    url = "https://google.com"
    headers = {
        'content-Type': 'application/json'
    }
    response = await session.request('GET', url)
    return response.json()

async def main():
    async with aiohttp.ClientSession() as session:
        return await asyncio.gather(
            get_event_1(session),
            get_event_2(session)
        )

loop = asyncio.get_event_loop()
x = loop.run_until_complete(main())
loop.close()
print(x)

Output:

$ python async.py 
[<coroutine object ClientResponse.json at 0x10567ae60>, <coroutine object ClientResponse.json at 0x10567aef0>]
sys:1: RuntimeWarning: coroutine 'ClientResponse.json' was never awaited

How do i print the responses instead?


Solution

  • The error message you received is informing you that a coroutine was never awaited.

    You can see from the aiohttp documentation that response.json() is a also a coroutine and therefore must be awaited. https://docs.aiohttp.org/en/stable/client_quickstart.html#json-response-content

    return await response.json()