Skip to main content

PyProxy

CI codecov PyPI version Python 3.13+ License: MIT

A modern, production-grade reverse proxy built entirely in Python on asyncio.

PyProxy is a high-performance reverse proxy and load balancer designed for modern infrastructure. It implements its own HTTP request lifecycle from the ground up — no frameworks, no shortcuts.

Features

  • Async-native — Built on Python's asyncio with optional uvloop acceleration
  • Full HTTP/1.1 — Streaming, chunked encoding, keep-alive, persistent connections
  • Load Balancing — Round Robin, Weighted RR, Least Connections, IP Hash, and more
  • Health Checking — Active and passive checks with automatic recovery and circuit breaker
  • TLS Termination — Certificate loading, SNI, mutual TLS, OCSP stapling
  • WebSocket Proxy — Full upgrade, ping/pong, streaming, reconnect
  • Middleware Pipeline — Extensible before/after request hooks
  • Caching — In-memory and Redis with Cache-Control, ETag, conditional requests
  • Compression — gzip and Brotli with content negotiation
  • Authentication — JWT, Basic Auth, API Keys, OAuth hooks
  • Security — Rate limiting, IP allow/deny lists, CORS, CSRF, header sanitization
  • Observability — Prometheus metrics, structured JSON logging, request tracing
  • Hot Reload — Configuration changes applied without restart
  • CLIpyproxy start, validate, reload, benchmark, and more

Quick Start

Installation

pip install python-pyproxy

FastAPI / ASGI Gateway Integration (v0.2.0)

Mount PyProxy as a centralized microservice gateway directly inside FastAPI or Starlette with full plugin support (Auth, JWT, Rate Limiting, Caching):

from fastapi import FastAPI
from pyproxy.asgi import PyProxyGateway
from pyproxy.auth import AuthMiddleware

app = FastAPI(title="Central Microservice Gateway")

# Mount PyProxy as ASGI Gateway middleware
app.add_middleware(
    PyProxyGateway,
    routes=[
        {"path": "/users", "target": "http://127.0.0.1:8001"},
        {"path": "/orders", "target": "http://127.0.0.1:8002", "strip_prefix": True},
    ],
    auth=AuthMiddleware(valid_api_keys={"secret-key-123"}),
    rate_limit=100, # Rate limiting (100 req/min per IP)
    enable_caching=True, # Response TTL caching
)

@app.get("/health")
def health_check():
    return {"status": "healthy", "gateway": "PyProxy v0.2.0"}

YAML / CLI Proxy Server Quick Start

Create a config.yaml:

server:
  bind_host: "0.0.0.0"
  bind_port: 8080

routes:
  - path: "/api"
    upstream:
      targets:
        - host: "127.0.0.1"
          port: 3000

Start via CLI or Python:

pyproxy start config.yaml
from pyproxy import Proxy

proxy = Proxy(config_path="config.yaml")
proxy.run()

Advanced FastAPI Gateway & Plugin Configuration

from fastapi import FastAPI
from pyproxy.asgi import PyProxyGateway
from pyproxy.auth import AuthMiddleware
from pyproxy.middleware import BaseMiddleware
from pyproxy.protocol import HTTPRequest, HTTPResponse

# Custom JWT Authentication Plugin
class JWTAuthPlugin(BaseMiddleware):
    async def process_request(self, request: HTTPRequest) -> HTTPRequest | HTTPResponse | None:
        token = request.headers.get("Authorization", "").replace("Bearer ", "")
        if token != "secret-jwt-token":
            return HTTPResponse.create_error(401, "Invalid JWT Token") # Short-circuit
        return None

app = FastAPI(title="Central Microservice Gateway")

# Mount PyProxy as ASGI middleware with full Plugin pipeline
app.add_middleware(
    PyProxyGateway,
    routes=[
        {"path": "/users", "target": "http://127.0.0.1:8001"},
        {"path": "/orders", "target": "http://127.0.0.1:8002"},
    ],
    middlewares=[JWTAuthPlugin()], # Custom JWT Auth plugin
    auth=AuthMiddleware(valid_api_keys={"my-key"}), # API Key Auth plugin
    rate_limit=60, # Rate limiting plugin (60 req/min per IP)
    enable_caching=True, # In-memory TTL caching plugin
)

FastAPI Gateway Plugin Usage Guide

Plugin When to Use How to Use
JWT / OAuth Protect backend microservices behind FastAPI with token verification. Subclass BaseMiddleware, override process_request(), pass to middlewares=[...].
API Keys & Basic Auth Service-to-service auth or developer API endpoints. Pass auth=AuthMiddleware(valid_api_keys={...}) into PyProxyGateway.
Rate Limiting Prevent API abuse and DDoS attacks per client IP. Set rate_limit=60 (requests per minute per IP) in PyProxyGateway.
In-Memory Caching Deliver sub-millisecond responses for read-heavy GET routes. Set enable_caching=True in PyProxyGateway.
Audit & Header Hooks Inject correlation IDs (X-Correlation-ID) or response signatures. Subclass BaseMiddleware, override process_request() / process_response().

Configuration

PyProxy supports YAML, JSON, and TOML configuration files. Environment variables can override any setting using the PYPROXY_ prefix:

# Override bind port
export PYPROXY_SERVER__BIND_PORT=9090

# Override log level
export PYPROXY_LOGGING__LEVEL=debug

See examples/ for annotated configuration examples.

Development

# Clone and install
git clone https://github.com/ashvn24/PyProxy.git
cd PyProxy
pip install -e ".[dev,test]"

# Run checks
make lint        # Ruff linting
make typecheck   # Mypy strict mode
make test        # Pytest
make coverage    # Coverage report
make check-all   # All of the above

See CONTRIBUTING.md for the full developer guide.

Architecture

PyProxy follows Clean Architecture with clear module boundaries:

Module Responsibility
server Low-level asyncio TCP server, connection lifecycle
routing Route matching (prefix, regex, host, wildcard)
proxy Reverse proxy engine, header rewriting, streaming
upstream Upstream connection pooling and management
load_balancer Load balancing strategies
health Health checking and circuit breaker
middleware Extensible middleware pipeline
config Configuration loading, validation, hot reload
ssl TLS termination, certificate management
websocket WebSocket proxy with upgrade handling
cache Response caching (memory, Redis)
compression gzip/Brotli response compression
auth Authentication (JWT, Basic, API Key)
security Rate limiting, CORS, IP filtering
metrics Prometheus metrics collection
logging Structured JSON logging with context

License

MIT — see LICENSE for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_pyproxy-0.2.1.tar.gz (90.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_pyproxy-0.2.1-py3-none-any.whl (103.1 kB view details)

Uploaded Python 3

File details

Details for the file python_pyproxy-0.2.1.tar.gz.

File metadata

  • Download URL: python_pyproxy-0.2.1.tar.gz
  • Upload date:
  • Size: 90.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.7

File hashes

Hashes for python_pyproxy-0.2.1.tar.gz
Algorithm Hash digest
SHA256 fab3e4b1ff4bb6b61c53637ef3a80cf17d532cef06e1c1ea8977827386bfaabf
MD5 60f9d5d03fa20e1b32cf41b762730e7c
BLAKE2b-256 73abef42cff99087a672a86bcfa87193798c85f088feb00250de76edfa6e90dd

See more details on using hashes here.

File details

Details for the file python_pyproxy-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: python_pyproxy-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 103.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.7

File hashes

Hashes for python_pyproxy-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 57e61c18b24b297c8a3f6875e61a5c5b1f82fabbd01c3b3fd3c5122801d61719
MD5 035c7a3adcb87de55dc473c1960e0881
BLAKE2b-256 ed94f25e732e626f91060eab865491d4982cdf919128c7a9f27b0bcf65a31e51

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page