GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - modern-python/httpware: Typed, resilient HTTP clients for Python, sync and async

BranchesTags
Open more actions menu

Latest commit

 

History

645 Commits
645 Commits

Folders and files

NameName
Last commit message
Last commit date
.github/workflows
.github/workflows
 
 
benchmarks
benchmarks
 
 
docs
docs
 
 
overrides
overrides
 
 
scripts
scripts
 
 
src/httpware
src/httpware
 
 
tests
tests
 
 
.gitignore
.gitignore
 
 
AGENTS.md
AGENTS.md
 
 
CLAUDE.md
CLAUDE.md
 
 
CONTEXT.md
CONTEXT.md
 
 
CONTRIBUTING.md
CONTRIBUTING.md
 
 
LICENSE
LICENSE
 
 
README.md
README.md
 
 
SECURITY.md
SECURITY.md
 
 
context7.json
context7.json
 
 
justfile
justfile
 
 
mkdocs.yml
mkdocs.yml
 
 
pyproject.toml
pyproject.toml
 
 

Repository files navigation

httpware

PyPI version Supported Python versions Downloads Coverage CI License GitHub stars Context7 uv Ruff ty

Typed, resilient HTTP clients for Python, sync and async.

Why httpware

  • A 4xx or 5xx response raises an exception named after its status, such as NotFoundError for 404 or RateLimitedError for 429. All of them subclass httpware.StatusError, so you never call raise_for_status().
  • response_model=User decodes the body into your pydantic or msgspec type. If no installed decoder handles the type, the call fails before the request is sent.
  • Retry with a retry budget, bulkhead, circuit breaker, and timeout ship as middleware you compose per client.

httpware is a thin layer over httpx2: requests and responses are plain httpx2.Request and httpx2.Response objects.

Status: Pre-1.0. Public API is subject to change between minor releases until v1.0.

Install

pip install httpware                     # core only, no decoder
pip install httpware[pydantic]           # PydanticDecoder: BaseModel, dataclasses, primitives, generics
pip install httpware[msgspec]            # MsgspecDecoder: Struct, dataclasses, primitives, generics
pip install httpware[pydantic,msgspec]   # both; BaseModel goes to pydantic, Struct to msgspec
pip install httpware[otel]               # OpenTelemetry span events
pip install httpware[all]                # pydantic, msgspec, and otel

Quickstart

A typed GET against a live API (needs pip install httpware[pydantic]):

import asyncio

from httpware import AsyncClient
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name: str


async def main() -> None:
    async with AsyncClient(base_url="https://jsonplaceholder.typicode.com") as client:
        user = await client.get("/users/1", response_model=User)
        print(user.name)  # Leanne Graham


asyncio.run(main())

The sync Client works the same way: use Client instead of AsyncClient, and drop await and async with. A 4xx/5xx response raises a typed StatusError; a malformed body raises DecodeError. Both subclass httpware.ClientError.

Documentation

Full guides live at httpware.modern-python.org:

  • Quickstart: first requests, client options, streaming.
  • Resilience: retry and retry budget, bulkhead, circuit breaker, timeout.
  • Errors: the exception tree and how to catch it.
  • Decoders: typed response bodies and custom decoders.
  • Middleware: writing your own (auth, tracing, request IDs).
  • Observability: logger and event names, OpenTelemetry wiring.
  • Testing: injecting httpx2.MockTransport.
  • Recipes: DI wiring, phase decorators, Link header pagination.

Links

  • Documentation
  • PyPI
  • License
  • Release notes

If this project saves you time, consider giving it a star on GitHub.

Part of modern-python

Browse the full list of templates and libraries in modern-python; the org profile has the categorized index.

About

Typed, resilient HTTP clients for Python, sync and async

httpware.modern-python.org

Topics

asynciobulkheadcircuit-breakerhttp-clienthttpxmiddlewaremsgspecpydanticpythonresilienceretry

Resources

Readme
MIT license

Code of conduct

Code of conduct

Contributing

Contributing

Security policy

Security policy
Activity
Custom properties

Stars

2 stars

Watchers

0 watching

Forks

0 forks
Report repository

Releases

Sponsor this project

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.