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 — adapt werkzeug.FileStorage for sync Uploader
  • get_storage_provider / ImproperlyConfiguredUploadKit — resolve factory from current_app.config
  • json_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