Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

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.dev2.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.dev2-py3-none-any.whl (103.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: python_pyproxy-0.2.1.dev2.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.dev2.tar.gz
Algorithm Hash digest
SHA256 6a1b85c3622871f6c88005620966a21360e0ea558de9b8f5821db906f71652c7
MD5 115c4ee2e63e20e217d0f030a3bedd5f
BLAKE2b-256 69a9adf5570f647c7012772b7df53bbd1b9bd798820e590cc641c2b4e79fe60b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_pyproxy-0.2.1.dev2-py3-none-any.whl
Algorithm Hash digest
SHA256 ad40defd5301d6d0217b990dcdeb147beefe9e833006fd373a9ce47df04349ab
MD5 d9c3e4e97a3afa639f96ce7e69c21ebe
BLAKE2b-256 38743c45b72d24f8e26a914836517c1491acdbbe8503a05ee85272dbf6b912a2

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