Skip to content

⚡ Async HTTP client with expressive logging and route-based requests

License

Notifications You must be signed in to change notification settings

ndugram/fasthttp

httpx ruff mypy Python License

Simple & Fast HTTP Client for Python

DocumentationQuick StartExamples

Features

  • Simple API - Minimal boilerplate with decorators
  • Beautiful Logging - Colorful request/response logs with timing
  • Async Support - Built on httpx for high performance
  • Type Safe - Full type annotations with Pydantic support
  • All HTTP Methods - GET, POST, PUT, PATCH, DELETE
  • Middleware - Request/response interception and modification
  • Rate Limiting - Multiple strategies (token bucket, leaky bucket, etc.)
  • HTTP/2 Support - Optional HTTP/2 protocol support
  • Request Info - Access to request details from response object

Quick Start

Installation

pip install fasthttp-client

Basic Usage

from fasthttp import FastHTTP
from fasthttp.response import Response

app = FastHTTP()


@app.get(url="https://httpbin.org/get")
async def get_data(resp: Response):
    return resp.json()


if __name__ == "__main__":
    app.run()

Output:

16:09:18.955 │ INFO     │ fasthttp │ ✔ FastHTTP started
16:09:19.519 │ INFO     │ fasthttp │ ✔ ← GET https://httpbin.org/get [200] 458.26ms
16:09:20.037 │ INFO     │ fasthttp │ ✔ Done in 1.08s

HTTP/2 Support

Enable HTTP/2 for better performance with servers that support it:

from fasthttp import FastHTTP
from fasthttp.response import Response

app = FastHTTP(http2=True)

@app.get(url="https://www.google.com/")
async def get_google(resp: Response):
    print(f"Status: {resp.status}")
    return resp.status

if __name__ == "__main__":
    app.run()

Note: Install with pip install fasthttp-client[http2] for HTTP/2 support. HTTP/2 works with servers like Google, GitHub, YouTube, and many others. Servers that don't support HTTP/2 will automatically fall back to HTTP/1.1.

Rate Limiting

Control request rate with multiple strategies:

from fasthttp import FastHTTP, RateLimitConfig
from fasthttp.response import Response

app = FastHTTP(
    rate_limit={
        "enabled": True,
        "strategy": "token_bucket",
        "requests_per_second": 10,
        "burst": 20,
    }
)

@app.get(url="https://api.example.com/data")
async def get_data(resp: Response):
    return resp.json()

if __name__ == "__main__":
    app.run()

Available strategies: token_bucket, leaky_bucket, fixed_window, sliding_window.

Middleware

Add custom logic to requests and responses:

from fasthttp import FastHTTP
from fasthttp.middleware import BaseMiddleware

class LoggingMiddleware(BaseMiddleware):
    async def before_request(self, route, config):
        print(f"Sending {route.method} to {route.url}")
        return config

app = FastHTTP(middleware=[LoggingMiddleware()])

@app.get(url="https://api.example.com/data")
async def get_data(resp):
    return resp.json()

if __name__ == "__main__":
    app.run()

Documentation

License

MIT License - see LICENSE file for details.

Contributing

See CONTRIBUTING.md for contribution guidelines.

Security

See SECURITY.md for security policies.

About

⚡ Async HTTP client with expressive logging and route-based requests

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published