Flask
Thin integration over Core. Adapts Werkzeug FileStorage, maps UploaderError to JSON, and resolves storage from app.config. Pair with uploadkit-security. Python 3.10+, Flask 3.0+.
Install
Shell
pip install uploadkit-flask uploadkit-security
Shell
uv add uploadkit-flask uploadkit-security
Shell
poetry add uploadkit-flask uploadkit-security
Adapter glue
Policy setup, validators, UploaderError, and the JSON response shape are shared — see Common patterns. as_uploadable() maps FileStorage.filename → Core name (form-field name is not the upload name).
Uses get_storage_provider() → Boto3S3Storage (AWS S3 or MinIO), as_uploadable(), and json_error_response().
views.py
from flask import current_app, jsonify, request
from uploadkit import Uploader, UploadPolicy, UploaderError
from uploadkit_flask import as_uploadable, get_storage_provider, json_error_response
from uploadkit_security import default_validators
def notify(result):
...
@app.post("/upload")
def upload_view():
storage = get_storage_provider()
policy = UploadPolicy(
max_size=5 * 1024 * 1024,
allowed_extensions=frozenset({"png"}),
allowed_mime_types=frozenset({"image/png"}),
validators=default_validators(),
)
uploaded = request.files["file"]
try:
result = Uploader(policy, storage).upload(
as_uploadable(uploaded),
bucket=current_app.config["UPLOADKIT_BUCKET"],
object_name=uploaded.filename,
after_upload=notify, # or Celery-like .delay
)
except UploaderError as exc:
return json_error_response(exc)
return jsonify({
"object_name": result.object_name,
"sha256": result.sha256,
"etag": result.etag,
})
Set UPLOADKIT_STORAGE_PROVIDER to a callable or dotted path. AWS: leave AWS_S3_ENDPOINT_URL unset. MinIO: set it to your endpoint.
app.config + storage.py
# app.config — AWS S3
app.config["AWS_ACCESS_KEY_ID"] = "AKIA..."
app.config["AWS_SECRET_ACCESS_KEY"] = "..."
app.config["AWS_S3_REGION_NAME"] = "eu-west-1"
app.config["UPLOADKIT_STORAGE_PROVIDER"] = "myapp.storage.get_provider"
app.config["UPLOADKIT_BUCKET"] = "my-prod-bucket"
# app.config — MinIO (instead of / in addition to keys)
# app.config["AWS_S3_ENDPOINT_URL"] = "http://127.0.0.1:9000"
# app.config["AWS_ACCESS_KEY_ID"] = "minioadmin"
# app.config["AWS_SECRET_ACCESS_KEY"] = "minioadmin"
# myapp/storage.py — Boto3S3Storage + get_provider()
# (full class in /docs/storage/)
def get_provider():
from flask import current_app
return Boto3S3Storage(
access_key=current_app.config["AWS_ACCESS_KEY_ID"],
secret_key=current_app.config["AWS_SECRET_ACCESS_KEY"],
region=current_app.config.get("AWS_S3_REGION_NAME", "us-east-1"),
endpoint_url=current_app.config.get("AWS_S3_ENDPOINT_URL"),
)
Public API
as_uploadable— adaptwerkzeug.FileStoragefor syncUploaderget_storage_provider/ImproperlyConfiguredUploadKit— resolve factory fromcurrent_app.configjson_error_response/status_for_error/error_payload— map Core errors to Flask JSON
After-upload hooks: Common patterns
·
Full Boto3S3Storage class:
Storage
·
uploadkit-flask README