S3 Static & Media Files for Django (more problems)
Trying to setup S3 for static files for my django project but only in Production mode. In local (development) mode I want to use local files.
From one of Coding For Entrepreneurs django videos I got this python snippet to support a production environment and a local environment.
settings/__init__.py
from .base import * from .production import * try: from .local import * except: pass
I followed the steps from the Coding For Entrepreneurs blog. I did steps #4, #5, #6 and I assume step #7 means to put the
from <your-project>.aws.conf import *
Into the settings/production.py?
And to leave it out of the settings/local.py?
Using the above settings/__init__.py on my local (development) environment the {% static %} template tag is replaced by https://s3.us-east-2.amazonaws.com/ S3 bucket url
If I comment out the from .production import * from settings/init.py
from .base import * #from .production import * try: from .local import * except: pass
I get the local.py STATIC_URL='/static/' from my settings/local.py
It's like the settings/production.py and/or <project>.aws.conf are setting some variables that are not unset or used in the local.py configuration.
What I think are relevant snippets from my settings/production.py
from arch.aws.conf import *
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'storages', 'items', 'searches', 'taggit', ] STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) STATIC_ROOT = os.path.join(BASE_DIR, "live-static", "static-root") MEDIA_ROOT = os.path.join(BASE_DIR, "live-static-files", "media-root") CORS_REPLACE_HTTPS_REFERER = True HOST_SCHEME = "https://" SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_SECONDS = 1000000 SECURE_FRAME_DENY = True And the aws/conf.py Copyimport datetime AWS_ACCESS_KEY_ID = "" AWS_SECRET_ACCESS_KEY = "" AWS_FILE_EXPIRE = 200 AWS_PRELOAD_METADATA = True AWS_QUERYSTRING_AUTH = True DEFAULT_FILE_STORAGE = 'arch.aws.utils.MediaRootS3BotoStorage' STATICFILES_STORAGE = 'arch.aws.utils.StaticRootS3BotoStorage' AWS_STORAGE_BUCKET_NAME = 'django.archdb' AWS_DEFAULT_ACL = None AWS_QUERYSTRING_AUTH = False AWS_S3_REGION_NAME = 'us-east-2' #S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME #MEDIA_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME # #MEDIA_ROOT = MEDIA_URL + 'media/' #STATIC_URL = S3_URL + 'static/' # #ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/' two_months = datetime.timedelta(days=61) date_two_months_later = datetime.date.today() + two_months expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 GMT") AWS_S3_OBJECT_PARAMETERS = { 'Expires': expires, 'CacheControl': 'max-age=%d' % (int(two_months.total_seconds()), ), }
I had to comment out the S3_URL and STATIC_URL to get the S3 stuff to work in production (Heroku) but I believe all the necessary variables are overridden in the local.py so I’m thinking the django-storages or boto3 apps are actually getting installed in the production.py INSTALLED_APPS and manipulating the STATIC_URL even when the local.py has overridden the INSTALL_APPS.
UPDATE #1
If I comment out the INSTALLED_APPS in the settings/production.py and uncomment the production configuration in settings/init.py
from .base import * from .production import * try: from .local import * except: pass
Then on my local (development) computer's the STATIC_URL is correct (not the S3 bucket) so some evidence that the problem is in the INSTALLED_APPS and probably the
django-storages django app.
UPDATE #2
I commented out just the django-storages from INSTALL_APPS in the settings/production.py and the local.py continues to work. I really think django-storages is messing with things.
UPDATE #3
I removed the __pycache__ directories and things are still broken
UPDATE #4
I think I found the problem. My settings/production.py imports the settings/aws/conf.py and settings/aws/conf.py changes the DEFAULT_FILE_STORAGE and the STATICFILES_STORAGE to the S3Boto3Storage.
Now I import the settings/local.py and because settings/local.py doesn't reset the DEFAULT_FILE_STORAGE and the STATICFILES_STORAGE they are still set to S3Boto3Storage.
In settings/local.py I reset the variables:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
This fixes my problem.
Comments