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.6.1.tar.gz
(52.2 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.6.1.tar.gz.
File metadata
- Download URL: app_platform-0.6.1.tar.gz
- Upload date:
- Size: 52.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
441dc469a5e26314cf4306178aa18707e30e10d24748ace32800f3fa28a3b097
|
|
| MD5 |
bfaefbd0f9c055c5a3ddc6607aac9e49
|
|
| BLAKE2b-256 |
c7fbab87daa26416b4a979b05e5b650f85e68ff69db3d5d9e7e025aa03f827c4
|
File details
Details for the file app_platform-0.6.1-py3-none-any.whl.
File metadata
- Download URL: app_platform-0.6.1-py3-none-any.whl
- Upload date:
- Size: 41.5 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 |
4a6b2b0f13f752473d85f5a8c6871d3fec5977d9763ad693d6fb94f13f00c48d
|
|
| MD5 |
22c9d505f9cc03b25d7ebefce0c2c4a2
|
|
| BLAKE2b-256 |
36182cf5dde943d434c248025b0d07f21bb218233184d814e54d8ca17b302db6
|