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:
@@ -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 = [
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
Reference in New Issue
Block a user