Skip to content
This repository has been archived by the owner on Jan 29, 2022. It is now read-only.
/ asgi-s3 Public archive

(WIP) Static file management tools and ASGI middleware support for Amazon S3

License

Notifications You must be signed in to change notification settings

jordaneremieff/asgi-s3

Repository files navigation

asgi-s3

Package version Build Status

Static file management tools and ASGI middleware support for Amazon S3.

Work in Progress: A lot of what is here currently will be changing, not recommended for any serious usage at this point.

Requirements: Python 3.6+

Installation

pip install asgi-s3

...but you probably just want to clone the master branch for the moment.

CLI

s3 create-bucket  Create a new S3 bucket.

s3 list-buckets   List all S3 buckets.

s3 sync-bucket    Sync a bucket with a local static file directory.

...todo

Middleware

The middleware is designed to work with any ASGI application. Here is raw ASGI example:

from asgi_s3.middleware import S3StorageMiddleware, s3_url_for


AWS_ACCESS_KEY_ID = "access-key-id"
AWS_SECRET_ACCESS_KEY = "secret-access-key"
BUCKET_NAME = "my-bucket"
REGION_NAME = "region-name"
STATIC_DIR = "path/to/static/files"


async def app(scope, receive, send):
    await send(
        {
            "type": "http.response.start",
            "status": 200,
            "headers": [[b"content-type", b"text/html; charset=utf-8"]],
        }
    )
    html_content = f"""
    <!DOCTYPE html>
    <html>
    <head>
        <title>ASGI S3 example</title>
        <link rel="stylesheet" href="{s3_url_for('style.css')}">
    </head>
    <body>
    Hello, world.
    </body>
    </html>
    """
    await send({"type": "http.response.body", "body": html_content.encode()})


app = S3StorageMiddleware(
    app,
    bucket_name=BUCKET_NAME,
    static_dir=STATIC_DIR,
    region_name=REGION_NAME,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)

And here is an example using Starlette:

from starlette.applications import Starlette
from starlette.templating import Jinja2Templates

from asgi_s3.middleware import S3StorageMiddleware, s3_url_for


templates = Jinja2Templates("templates")
app = Starlette()

@app.route("/")
def homepage(request):
    return templates.TemplateResponse(
        "index.html", {"request": request, "s3_url_for": s3_url_for}
    )


AWS_ACCESS_KEY_ID = "access-key-id"
AWS_SECRET_ACCESS_KEY = "secret-access-key"
BUCKET_NAME = "my-bucket"
REGION_NAME = "region-name"
STATIC_DIR = "path/to/static/files"


app.add_middleware(
    S3StorageMiddleware,
    bucket_name=BUCKET_NAME,
    static_dir=STATIC_DIR,
    region_name=REGION_NAME,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)

About

(WIP) Static file management tools and ASGI middleware support for Amazon S3

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published