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.3.0.tar.gz
(29.5 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.3.0.tar.gz.
File metadata
- Download URL: app_platform-0.3.0.tar.gz
- Upload date:
- Size: 29.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8db8e3382683f102e3abeecbb97f2cefa03f79681ad14dd814be078a5ce33b83
|
|
| MD5 |
25d4a8ce07e7630a3937d491fec9c43e
|
|
| BLAKE2b-256 |
1f9dfe2e19af757db281c881c985b96929f626c73ac706fbcdb43973db48b38f
|
File details
Details for the file app_platform-0.3.0-py3-none-any.whl.
File metadata
- Download URL: app_platform-0.3.0-py3-none-any.whl
- Upload date:
- Size: 39.9 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 |
a0e3d1dd0c5c6423548fffadd6d8c224dcc47fdd12de891189a155d823e192c8
|
|
| MD5 |
1a8a919f6e3fdf210b724b1873f5a005
|
|
| BLAKE2b-256 |
ee3efc270b1cf3c8e98931b13bcb97a93baf21bc463b9e5ad926b7cdf1400a81
|