Generic web app infrastructure: PostgreSQL pooling, structured logging, rate limiting, FastAPI middleware, auth service, gateway proxy
Project description
app-platform
Generic web app infrastructure for PostgreSQL pooling, structured logging, auth, middleware, and gateway proxying.
Installation
pip install app-platform
pip install "app-platform[all]"
pip install "app-platform[fastapi]"
pip install "app-platform[auth-google]"
pip install "app-platform[gateway]"
Included subpackages
| Subpackage | Provides |
|---|---|
db |
PostgreSQL connection pooling, pooled session helpers, migrations, and database exception utilities |
logging |
Structured file and JSONL logging, context helpers, logger access, and decorators for timing/error instrumentation |
middleware |
FastAPI middleware configuration for rate limiting, sessions, CORS, and validation/error handling |
auth |
Pluggable auth service base with in-memory and PostgreSQL-backed user/session stores |
gateway |
FastAPI router factory for proxying chat and tool approval requests to an upstream gateway |
Quick usage
Database
import os
from app_platform.db import PoolManager, get_db_session
os.environ["DATABASE_URL"] = "postgresql://postgres:postgres@localhost:5432/app"
pool_manager = PoolManager(min_connections=2, max_connections=10)
pool_manager.get_pool()
with get_db_session() as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT 1 AS ok")
print(cursor.fetchone())
pool_manager.close()
Logging
from app_platform.logging import (
LoggingManager,
configure_logging,
log_errors,
log_operation,
log_timing,
)
logging_manager: LoggingManager = configure_logging(app_name="orders", log_dir="./logs")
logger = logging_manager.get_logger("service")
@log_errors()
@log_timing(threshold_s=0.25)
@log_operation("create_order")
def create_order(order_id: str) -> None:
logger.info("creating order %s", order_id)
create_order("ord_123")
Auth
from app_platform.auth import AuthServiceBase, InMemorySessionStore, InMemoryUserStore
users = {}
sessions = {}
auth = AuthServiceBase(
session_store=InMemorySessionStore(users_dict=users, sessions_dict=sessions),
user_store=InMemoryUserStore(users_dict=users),
)
session_id = auth.create_user_session(
{
"google_user_id": "user-123",
"email": "user@example.com",
"name": "Example User",
}
)
print(auth.get_user_by_session(session_id))
Gateway
from fastapi import FastAPI
from app_platform.gateway import GatewayConfig, create_gateway_router
app = FastAPI()
def get_current_user():
return {"user_id": "user-123", "email": "user@example.com"}
gateway_router = create_gateway_router(
GatewayConfig(
gateway_url="https://gateway.example.com",
api_key="gateway-api-key",
channel="web",
),
get_current_user=get_current_user,
)
app.include_router(gateway_router, prefix="/gateway")
Requirements
Python 3.11+
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
app_platform-0.5.0.tar.gz
(49.3 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file app_platform-0.5.0.tar.gz.
File metadata
- Download URL: app_platform-0.5.0.tar.gz
- Upload date:
- Size: 49.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca7cc96a9f9e320c6023b9673276189b21e49e5696f1df105f43825a80467297
|
|
| MD5 |
53350e7998aa7a950d36afed7c3a3f07
|
|
| BLAKE2b-256 |
f7962cd9aa01912247eeba1abf261bf8267f78d381cc0d4d9aedfee04397786c
|
File details
Details for the file app_platform-0.5.0-py3-none-any.whl.
File metadata
- Download URL: app_platform-0.5.0-py3-none-any.whl
- Upload date:
- Size: 40.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ccf86fd79e96d89658aae7bfc5702e6f1815849454ff2e5a41d123f3aefe249
|
|
| MD5 |
582dc3ecce7fa5c48ab252e118a02221
|
|
| BLAKE2b-256 |
d8d93669d94f7e9e0a6f80dc8014713faf7a6e34b029b6845fe7e8a48303b255
|