Async SQLAlchemy framework with FastAPI integration - reusable foundation for building data services
Project description
Servicekit
Async SQLAlchemy framework with FastAPI integration - reusable foundation for building data services
Servicekit is a framework-agnostic core library providing foundational infrastructure for building async Python services with FastAPI and SQLAlchemy.
Features
- Database Layer: Async SQLAlchemy with SQLite support, connection pooling, and automatic migrations
- Repository Pattern: Generic repository base classes for data access
- Manager Pattern: Business logic layer with lifecycle hooks
- CRUD API: Auto-generated REST endpoints with full CRUD operations
- Authentication: API key middleware with file and environment variable support
- Job Scheduling: Async job scheduler with concurrency control
- App Hosting: Mount static web applications alongside your API
- Monitoring: Prometheus metrics and OpenTelemetry integration
- Health Checks: Flexible health check system with SSE streaming support
- Error Handling: RFC 9457 Problem Details for HTTP APIs
- Logging: Structured logging with request context
Installation
pip install servicekit
Quick Start
from servicekit.api import BaseServiceBuilder, ServiceInfo
app = (
BaseServiceBuilder(info=ServiceInfo(display_name="My Service"))
.with_health()
.with_database("sqlite+aiosqlite:///./data.db")
.build()
)
Architecture
servicekit/
├── database.py # Database, SqliteDatabase, SqliteDatabaseBuilder
├── models.py # Base, Entity ORM classes
├── repository.py # Repository, BaseRepository
├── manager.py # Manager, BaseManager
├── schemas.py # EntityIn, EntityOut, PaginatedResponse
├── scheduler.py # JobScheduler, AIOJobScheduler
├── exceptions.py # Error classes
├── logging.py # Structured logging
├── types.py # ULIDType, JsonSafe
└── api/ # FastAPI framework layer
├── router.py # Router base class
├── crud.py # CrudRouter, CrudPermissions
├── auth.py # API key authentication
├── app.py # Static app hosting
├── middleware.py # Error handlers, logging
└── routers/ # Health, Jobs, System, Metrics
Key Components
BaseServiceBuilder
from servicekit.api import BaseServiceBuilder, ServiceInfo
app = (
BaseServiceBuilder(info=ServiceInfo(display_name="My Service"))
.with_health() # Health check endpoint
.with_database(url) # Database configuration
.with_jobs(max_concurrency=10) # Job scheduler
.with_auth() # API key authentication
.with_monitoring() # Prometheus metrics
.with_app("./webapp") # Static web app
.include_router(custom_router) # Custom routes
.build()
)
Repository Pattern
from servicekit import BaseRepository, Entity
from sqlalchemy.orm import Mapped, mapped_column
class User(Entity):
__tablename__ = "users"
name: Mapped[str] = mapped_column()
email: Mapped[str] = mapped_column()
class UserRepository(BaseRepository[User, ULID]):
def __init__(self, session: AsyncSession):
super().__init__(session, User)
CRUD Router
from servicekit.api import CrudRouter, CrudPermissions
router = CrudRouter.create(
prefix="/api/v1/users",
tags=["Users"],
entity_in_type=UserIn,
entity_out_type=UserOut,
manager_factory=get_user_manager,
permissions=CrudPermissions(create=True, read=True, update=True, delete=False)
)
Examples
See the examples/ directory for complete working examples:
core_api.py- Basic CRUD servicejob_scheduler_api.py- Background job executionapp_hosting_api.py- Hosting static web appsauth_basic.py- API key authenticationmonitoring_api.py- Prometheus metrics
Documentation
See docs/ for comprehensive guides and API reference.
Testing
make test # Run tests
make lint # Run linter
make coverage # Test coverage
License
AGPL-3.0-or-later
Related Projects
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 servicekit-0.8.1.tar.gz.
File metadata
- Download URL: servicekit-0.8.1.tar.gz
- Upload date:
- Size: 41.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
219158670bf71c564d179776b4de597b8087455d3f314c7d4fd6b45f888b4154
|
|
| MD5 |
64f7e02aa00a4340a80908fd09b0ad9d
|
|
| BLAKE2b-256 |
5893bc5ffcb37102507ec52d1a916119448a6224dd1dc71456182e327bff7eb8
|
File details
Details for the file servicekit-0.8.1-py3-none-any.whl.
File metadata
- Download URL: servicekit-0.8.1-py3-none-any.whl
- Upload date:
- Size: 53.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
283f9de0576614ed00fd7749f6b00ec6b1428b92d871c96d08feab4c98f27e9e
|
|
| MD5 |
1e8fc4283f0fd11f41872560e0781622
|
|
| BLAKE2b-256 |
82f0760bd12207e4b3467b558b2e7e270f138a9840e9dbc632131fb68d97171a
|