Loading...
Loading...
Use when configuring Django to store static and media files on AWS S3 with django-storages. Invoke when working with the STORAGES setting, S3 buckets, presigned URLs, CloudFront, or boto3-backed file storage in settings.py. Configures the Django 4.2+ STORAGES dict, public/private custom backends, presigned GET/POST URLs, IAM policies, and S3 mocking for tests. Trigger terms: django-storages, S3, boto3, S3Boto3Storage, STORAGES, presigned URL, CloudFront, media files, collectstatic, AWS_STORAGE_BUCKET_NAME.
npx skill4agent add jeffallan/claude-skills django-storages-s3django-storagesboto3STORAGESDEFAULT_FILE_STORAGEFileFieldImageFieldpip install django-storages[s3] boto3"storages"INSTALLED_APPSSTORAGESdefaultstaticfileslocationSTORAGEScollectstaticInMemoryStoragemoto| Topic | Reference | Load When |
|---|---|---|
| Settings & STORAGES | | Core settings, 4.2+ vs legacy, CloudFront |
| Custom backends | | Public vs. private buckets, per-field storage |
| Presigned URLs | | Download links, direct browser uploads |
| Testing & IAM | | Mocking S3, IAM policy, common pitfalls |
STORAGESdefault_acl=None# settings.py
import os
AWS_STORAGE_BUCKET_NAME = os.environ["AWS_STORAGE_BUCKET_NAME"]
AWS_S3_REGION_NAME = os.environ.get("AWS_S3_REGION_NAME", "us-east-1")
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
# On EC2/ECS/Lambda, omit keys entirely — boto3 uses the attached IAM role.
STORAGES = {
"default": { # media uploads
"BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
"OPTIONS": {
"bucket_name": AWS_STORAGE_BUCKET_NAME,
"location": "media",
"default_acl": None, # rely on bucket policy, not per-object ACLs
"file_overwrite": False,
"querystring_auth": False, # public objects → clean URLs
},
},
"staticfiles": {
"BACKEND": "storages.backends.s3boto3.S3StaticStorage",
"OPTIONS": {
"bucket_name": AWS_STORAGE_BUCKET_NAME,
"location": "static",
},
},
}
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"# models.py — uploads go straight to S3 on save()
from django.db import models
class Document(models.Model):
file = models.FileField(upload_to="docs/") # uses STORAGES["default"]grep -rn "AWS_SECRET_ACCESS_KEY\|aws_secret" settings/os.environdjango-environgrep -rn "default_acl\|AWS_DEFAULT_ACL" .None"public-read""private"AccessControlListNotSupportedSTORAGESDEFAULT_FILE_STORAGESTATICFILES_STORAGES3StaticStoragedefaultstaticfileslocationcollectstaticregion_nameAWS_S3_REGION_NAMEAWS_S3_CUSTOM_DOMAINus-east-1querystring_auth=Truecustom_domain=None.url()AWS_QUERYSTRING_EXPIREfile_overwrite=FalseGet/Put/Delete/ListBucketdefault_acl=NonelocationSTORAGESDEFAULT_FILE_STORAGESTATICFILES_STORAGEcustom_domain=NoneInMemoryStoragemotoAWS_SECRET_ACCESS_KEYsettings.pyquerystring_auth=Truecustom_domainGet/Put/Delete/ListBucketdjango-expertfullstack-guardiandevops-engineer