quadkit-storage
Unified blob storage abstraction for Quadkit Framework — S3, GCS, Azure Blob, and local filesystem
Overview
quadkit-storage provides a unified BlobStore interface over Amazon S3, Google Cloud Storage, Azure Blob Storage, Cloudflare R2, and local disk — with signed URLs, streaming uploads, content-type negotiation, and server-side encryption. All services are wired via StorageProvider, which registers the blob store protocol with the DI container.
Full documentation: docs.quadkit.dev
Install
uv add quadkit-storage
# Optional extras
uv add "quadkit-storage[s3]" # Amazon S3 (aiobotocore)
uv add "quadkit-storage[gcp]" # Google Cloud Storage
uv add "quadkit-storage[azure]" # Azure Blob Storage
Quick Start
from quadkit import Application
from quadkit.di.module import Module, module
# Import the module from the package
from quadkit.storage import StorageModule
from quadkit.storage.config import StorageConfig, StorageLocalConfig
@module(
imports=[
StorageModule.configure(
StorageConfig(drivers={"local": StorageLocalConfig(root_dir="./storage")})
)
]
)
class AppModule(Module):
pass
async with Application.boot(modules=[AppModule]) as app:
# use app.container to resolve services
...
Configuration
Zero-config usage: Call
StorageModule.configure()with no arguments to use defaults.
Option 1 — YAML file
# application.yaml
storage:
default_driver: "s3"
drivers:
s3:
bucket: "my-app-uploads"
region: "us-east-1"
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"
Option 2 — Profiles + Environment Variables (recommended)
export QK_STORAGE__ENABLED=true
# Environment variables for each field
Option 3 — Python
from quadkit.storage.config import StorageConfig
from quadkit.storage import StorageModule
config = StorageConfig(default_driver="s3", ...)
StorageModule.configure(config)
Config reference
| Field | Default | Env var | Description |
|---|---|---|---|
default_driver |
"local" |
QK_STORAGE__DEFAULT_DRIVER |
Active driver: s3, gcs, azure, r2, local, memory |
drivers.s3.bucket |
— | QK_STORAGE__DRIVERS__S3__BUCKET |
S3 bucket name |
drivers.s3.region |
"us-east-1" |
QK_STORAGE__DRIVERS__S3__REGION |
AWS region |
drivers.s3.access_key |
— | QK_STORAGE__DRIVERS__S3__ACCESS_KEY |
AWS access key ID |
drivers.s3.secret_key |
— | QK_STORAGE__DRIVERS__S3__SECRET_KEY |
AWS secret access key |
drivers.s3.endpoint_url |
null |
QK_STORAGE__DRIVERS__S3__ENDPOINT_URL |
Override endpoint (MinIO, LocalStack) |
drivers.gcs.bucket |
— | QK_STORAGE__DRIVERS__GCS__BUCKET |
GCS bucket name |
drivers.gcs.credentials_path |
— | QK_STORAGE__DRIVERS__GCS__CREDENTIALS_PATH |
Path to service account JSON |
drivers.azure.account_name |
— | QK_STORAGE__DRIVERS__AZURE__ACCOUNT_NAME |
Azure storage account name |
drivers.azure.container |
— | QK_STORAGE__DRIVERS__AZURE__CONTAINER |
Azure blob container |
drivers.local.root_dir |
— | QK_STORAGE__DRIVERS__LOCAL__ROOT_DIR |
Root directory for local storage |
service.max_file_size_mb |
100 |
QK_STORAGE__SERVICE__MAX_FILE_SIZE_MB |
Maximum upload size in MB |
Module Factory Methods
| Method | Description |
|---|---|
StorageModule.configure(config, enable_encryption) |
Configure with explicit StorageConfig |
StorageModule.stub() |
Minimal config for testing |
Key Features
- S3 — Multi-part upload, server-side encryption, lifecycle rules
- GCS — Resumable uploads, CMEK, uniform bucket-level access
- Azure — Block blobs, shared access signatures (SAS), CDN integration
- R2 — Cloudflare R2 (S3-compatible) support
- Local driver — On-disk storage for development and CI
- Memory driver — In-process storage for unit tests
- Signed URLs — Time-limited GET / PUT pre-signed URLs for direct browser upload
- Content negotiation — Automatic MIME type detection from extension and magic bytes
- Key-value store —
InMemoryKVStorage(memory) /LocalStorage(file) for small blobs (config, flags) - Streaming —
stream()yields chunks for arbitrarily large files
Testing
async with Application.boot(modules=[StorageModule.stub()]) as app:
# your test code
...
Key Source Files
| File | What it contains |
|---|---|
src/quadkit/storage/module.py |
StorageModule class with factory methods |
src/quadkit/storage/di/provider.py |
StorageProvider — wires storage protocols into DI container |
src/quadkit/storage/config.py |
StorageConfig and sub-config classes |
src/quadkit/storage/backends/ |
Driver implementations (AbstractDriver, S3, GCS, Azure, R2, local, memory) |
src/quadkit/storage/kv/ |
KV backends (InMemoryKVStorage, LocalStorage) |
Metadata
Release files for quadkit-storage 0.0.43
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| quadkit_storage-0.0.43.tar.gz | 89.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quadkit_storage-0.0.43-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 162.2 kB
Release files / quadkit_storage-0.0.43.tar.gz
| Download URL | quadkit_storage-0.0.43.tar.gz |
|---|---|
| Size | 89.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
04c025ba76ff134e03309db886f23de7996be997161654b57d213552e2aa4d6f
|
|
BLAKE2b-256 checksum How to use checksums |
67b74f3f0a68bd31f21f52943ec8f67ba4a7f287b27a76166e03f4ee4198e32a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.14
|
Release files / quadkit_storage-0.0.43-py3-none-any.whl
| Download URL | quadkit_storage-0.0.43-py3-none-any.whl |
|---|---|
| Size | 72.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
df63906fa696886b74271ee90d893fc2a311b0d1e1ff729d60691e9d6a886d03
|
|
BLAKE2b-256 checksum How to use checksums |
d5f1108d087281e761fd4a7166e693118c5a4aeb136f8f8eba87489c2cc4aa13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.14
|
Security for quadkit-storage 0.0.43
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.