fix: Add missing Django core apps and DigitalOcean Spaces support

- Add django.contrib.auth, contenttypes, sessions, sites, messages,
  staticfiles, and admin to INSTALLED_APPS
- Add DigitalOcean Spaces (S3-compatible) storage configuration
- Add AWS_S3_ENDPOINT_URL setting for custom S3 endpoints

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-11-29 21:32:29 -05:00
parent 7b0cf62019
commit 3ddd762d74
2 changed files with 30 additions and 6 deletions

View File

@@ -61,6 +61,13 @@ WSGI_APPLICATION = "config.wsgi.application"
# APPS # APPS
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
DJANGO_APPS = [ DJANGO_APPS = [
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.sites",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.admin",
"django.forms", "django.forms",
] ]
THIRD_PARTY_APPS = [ THIRD_PARTY_APPS = [

View File

@@ -68,22 +68,35 @@ SECURE_CONTENT_TYPE_NOSNIFF = env.bool(
# STATIC & MEDIA # STATIC & MEDIA
# ------------------------ # ------------------------
# AWS S3 storage is optional - only configure if credentials are provided # S3-compatible storage (AWS S3 or DigitalOcean Spaces)
AWS_ACCESS_KEY_ID = env("DJANGO_AWS_ACCESS_KEY_ID", default="") AWS_ACCESS_KEY_ID = env("DJANGO_AWS_ACCESS_KEY_ID", default="")
AWS_SECRET_ACCESS_KEY = env("DJANGO_AWS_SECRET_ACCESS_KEY", default="") AWS_SECRET_ACCESS_KEY = env("DJANGO_AWS_SECRET_ACCESS_KEY", default="")
AWS_STORAGE_BUCKET_NAME = env("DJANGO_AWS_STORAGE_BUCKET_NAME", default="") AWS_STORAGE_BUCKET_NAME = env("DJANGO_AWS_STORAGE_BUCKET_NAME", default="")
# For DigitalOcean Spaces, use endpoint like: https://nyc3.digitaloceanspaces.com
AWS_S3_ENDPOINT_URL = env("DJANGO_AWS_S3_ENDPOINT_URL", default="")
AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None)
AWS_S3_CUSTOM_DOMAIN = env("DJANGO_AWS_S3_CUSTOM_DOMAIN", default=None)
if AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_STORAGE_BUCKET_NAME: if AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_STORAGE_BUCKET_NAME:
# Use S3 for media storage # Use S3/Spaces for media storage
AWS_QUERYSTRING_AUTH = False AWS_QUERYSTRING_AUTH = False
_AWS_EXPIRY = 60 * 60 * 24 * 7 _AWS_EXPIRY = 60 * 60 * 24 * 7
AWS_S3_OBJECT_PARAMETERS = { AWS_S3_OBJECT_PARAMETERS = {
"CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate", "CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate",
} }
AWS_S3_MAX_MEMORY_SIZE = env.int("DJANGO_AWS_S3_MAX_MEMORY_SIZE", default=100_000_000) AWS_S3_MAX_MEMORY_SIZE = env.int("DJANGO_AWS_S3_MAX_MEMORY_SIZE", default=100_000_000)
AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None)
AWS_S3_CUSTOM_DOMAIN = env("DJANGO_AWS_S3_CUSTOM_DOMAIN", default=None) # Determine the domain for URLs
aws_s3_domain = AWS_S3_CUSTOM_DOMAIN or f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com" if AWS_S3_CUSTOM_DOMAIN:
aws_s3_domain = AWS_S3_CUSTOM_DOMAIN
elif AWS_S3_ENDPOINT_URL:
# DigitalOcean Spaces: bucket.region.digitaloceanspaces.com
from urllib.parse import urlparse
endpoint_parts = urlparse(AWS_S3_ENDPOINT_URL)
region = endpoint_parts.netloc.split('.')[0] # e.g., 'nyc3' from nyc3.digitaloceanspaces.com
aws_s3_domain = f"{AWS_STORAGE_BUCKET_NAME}.{region}.digitaloceanspaces.com"
else:
aws_s3_domain = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
STORAGES = { STORAGES = {
"default": { "default": {
@@ -94,10 +107,14 @@ if AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_STORAGE_BUCKET_NAME:
}, },
}, },
"staticfiles": { "staticfiles": {
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage", "BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
"location": "static",
},
}, },
} }
MEDIA_URL = f"https://{aws_s3_domain}/media/" MEDIA_URL = f"https://{aws_s3_domain}/media/"
STATIC_URL = f"https://{aws_s3_domain}/static/"
else: else:
# Use local filesystem storage # Use local filesystem storage
STORAGES = { STORAGES = {