0
0
FastapiHow-ToBeginner · 4 min read

How to Use aiohttp with FastAPI for Async HTTP Requests

To use aiohttp with FastAPI, create an aiohttp.ClientSession inside an async endpoint or startup event, then use it to make async HTTP calls. This allows FastAPI to handle external requests without blocking, improving performance.
📐

Syntax

Use aiohttp.ClientSession() to create a session for making HTTP requests asynchronously. Use async with to ensure proper resource cleanup. Inside FastAPI async endpoints, await the session's get or post methods to fetch data.

Example parts:

  • async with aiohttp.ClientSession() as session: - creates a session context
  • await session.get(url) - performs async GET request
  • await response.json() - reads JSON response asynchronously
python
import aiohttp

async def fetch_data(url: str):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.json()
💻

Example

This example shows a FastAPI app with an endpoint that fetches JSON data from an external API using aiohttp asynchronously. It demonstrates how to create a client session and await the response inside the endpoint.

python
from fastapi import FastAPI
import aiohttp

app = FastAPI()

@app.get("/external-data")
async def get_external_data():
    url = "https://jsonplaceholder.typicode.com/todos/1"
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            data = await response.json()
            return data
Output
{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": false}
⚠️

Common Pitfalls

Common mistakes when using aiohttp with FastAPI include:

  • Not using async with for ClientSession, which can cause resource leaks.
  • Blocking calls inside async endpoints, which defeats the purpose of async.
  • Creating a new ClientSession on every request without reusing it, which can be inefficient.

To avoid these, create a session once on startup and reuse it, or use async with properly.

python
from fastapi import FastAPI
import aiohttp

app = FastAPI()

# Wrong: Creating session on every request without async context
@app.get("/wrong")
async def wrong_way():
    session = aiohttp.ClientSession()  # Missing async with
    response = await session.get("https://jsonplaceholder.typicode.com/todos/1")
    data = await response.json()
    await session.close()
    return data

# Right: Using async with to manage session
@app.get("/right")
async def right_way():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://jsonplaceholder.typicode.com/todos/1") as response:
            return await response.json()
📊

Quick Reference

Tips for using aiohttp with FastAPI:

  • Use async with aiohttp.ClientSession() to manage sessions safely.
  • Reuse sessions if making many requests to improve performance.
  • Always await HTTP calls to avoid blocking.
  • Handle exceptions like aiohttp.ClientError to manage network issues gracefully.

Key Takeaways

Use aiohttp's async ClientSession inside FastAPI async endpoints for non-blocking HTTP calls.
Always use 'async with' to manage aiohttp sessions and responses to avoid resource leaks.
Reuse ClientSession when possible to improve efficiency in multiple requests.
Await all aiohttp calls to keep FastAPI endpoints asynchronous and responsive.
Handle network errors with try-except to make your app robust.