Skip to main content

FastAPI Request ID

A FastAPI middleware for request ID propagation and tracing across microservices.

Quick Start

1. Add Middleware

from fastapi import FastAPI
from fastapi_reqid import RequestIDMiddleware

app = FastAPI()

# Add middleware with default settings
app.add_middleware(RequestIDMiddleware)

# Or customize it
app.add_middleware(
    RequestIDMiddleware,
    header_name="X-Correlation-ID",  # Custom header name
    generator=lambda: str(uuid.uuid4())  # Custom ID generator
)

2. Access Request ID

from fastapi import Request
from fastapi_reqid import get_request_id

@app.get("/")
async def root(request: Request):
    # Access via request.state
    request_id = request.state.request_id

    # Or use the context helper
    request_id = get_request_id()

    return {"request_id": request_id}

HTTP Client Decorators

Automatically inject request IDs into outgoing HTTP requests.

httpx

from fastapi import Request
from fastapi_reqid import inject_httpx_requestid

@app.get("/external")
@inject_httpx_requestid
async def call_external(request: Request):
    client = request.state.httpx_client
    response = await client.get("https://api.example.com")
    return response.json()

aiohttp

from fastapi import Request
from fastapi_reqid import inject_aiohttp_requestid

@app.get("/external")
@inject_aiohttp_requestid
async def call_external(request: Request):
    session = request.state.aiohttp_session
    async with session.get("https://api.example.com") as resp:
        return await resp.json()

requests

from fastapi import Request
from fastapi_reqid import inject_requests_requestid

@app.get("/external")
@inject_requests_requestid
def call_external(request: Request):
    session = request.state.requests_session
    response = session.get("https://api.example.com")
    return response.json()

Manual Request ID Management

Use these functions to manually get or set request IDs:

from fastapi_reqid import get_request_id, set_request_id, request_id_context

# Get current request ID
request_id = get_request_id()

# Set request ID manually
token = set_request_id("custom-request-id")
try:
    # Do work with this request ID
    pass
finally:
    # Reset to previous value
    request_id_context.reset(token)

Building and Publishing

Building the Library

This project uses uv for building. To build the distribution packages:

# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh

# Build the package (creates wheel and source distribution)
uv build

This will create two files in the dist/ directory:

  • fastapi_reqid-{version}-py3-none-any.whl - Python wheel
  • fastapi_reqid-{version}.tar.gz - Source distribution

Publishing to PyPI

Before publishing to the main PyPI, test your package on TestPyPI:

# Publish to TestPyPI
uv publish --publish-url https://test.pypi.org/legacy/

You'll need a TestPyPI account and API token from test.pypi.org.

Publish to PyPI

Once you've verified the package works correctly:

# Publish to PyPI
uv publish

You'll need a PyPI account and API token from pypi.org.

Development Setup

To set up a development environment:

# Create virtual environment
uv venv

# Install package in editable mode with dev dependencies
uv pip install -e ".[dev]"

# Run tests
pytest

How It Works

  1. The middleware extracts the request ID from incoming headers (default: X-Request-ID)
  2. If no request ID is found, it generates one using UUID v4
  3. The request ID is stored in both request.state and a context variable
  4. The request ID is automatically added to response headers
  5. Context is automatically cleaned up after each request

License

MIT License - see LICENSE file for details

Metadata

Release files for fastapi-reqid 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fastapi-reqid 0.1.0
File Size Uploaded
fastapi_reqid-0.1.0.tar.gz 5.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-reqid 0.1.0
File Interpreter ABI Platform
fastapi_reqid-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.1 kB

Release files / fastapi_reqid-0.1.0.tar.gz

Download URL fastapi_reqid-0.1.0.tar.gz
Size 5.7 kB
Tags Source
SHA-256 checksum
How to use checksums
78897ba7578dfef9c9eda142bd606c9d28ab4e2d07adaaab23a23e2291b3e2f3
BLAKE2b-256 checksum
How to use checksums
ab909975acd8e5e861ba738210df70f0a0ab99c14804bf1e48c0671a53abe197
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.6

Release files / fastapi_reqid-0.1.0-py3-none-any.whl

Download URL fastapi_reqid-0.1.0-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c3ba5db518b573ce4ed5868a27aae93dd7c338b935d8083c821eee46797d1da8
BLAKE2b-256 checksum
How to use checksums
101e2884f4e937e832dde3f90ebeddfb95b49996592efc247d55d24201615ef8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.6

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page