django-storages

Configuration

Add django-storages with s3 to pyproject.toml:

uv add django-storages[s3]  --group dev

Add storages to THIRD_PARTY_APPS in src/settings/base.py:

THIRD_PARTY_APPS = (
    # ...
    "storages",

Add the following to production settings (src/settings/production.py):

AWS_S3_ACCESS_KEY_ID = get_env_variable("AWS_S3_ACCESS_KEY_ID")
AWS_S3_SECRET_ACCESS_KEY = get_env_variable("AWS_S3_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = get_env_variable("AWS_STORAGE_BUCKET_NAME")
AWS_S3_ENDPOINT_URL = get_env_variable("AWS_S3_ENDPOINT_URL")
AWS_S3_REGION_NAME = get_env_variable("AWS_DEFAULT_REGION")

STORAGES = {
    "default": {"BACKEND": "base.storage.MediaStorage"},
    "private": {"BACKEND": "base.storage.PrivateStorage"},
    "staticfiles": {"BACKEND": "base.storage.StaticStorage"},
}

Development

Create

To create a file on Digital Ocean Spaces / S3:

from base.storage import PrivateStorage
from django.http import HttpResponseRedirect

storage = PrivateStorage()
file_name = storage.save(f"{folder}/{pdf_file_name}", content_file)
url = storage.url(file_name)
return HttpResponseRedirect(url)

Download (for the user)

from base.storage import is_aws
from django.http import HttpResponseRedirect

if is_aws():
    return HttpResponseRedirect(schedule.output_file.url)

Tip

For sample code, see the download_report function in the report app (src/report/views.py).

Download (for processing)

To download a file for processing from the Digital Ocean Spaces or Amazon S3, check the download_csv_from_s3 function in the report app (src/report/views.py).

is_aws

The is_aws method checks the AWS_S3_ACCESS_KEY_ID setting:

from base.storage import is_aws

if is_aws():
    # do something...
    pass