How to use different staticfiles location based on if it is development or production server
up vote
0
down vote
favorite
This is my settings.py
:
import os
import sys
SECRET_KEY = 'secrit'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
if RUNNING_DEVSERVER:
DEBUG = True
else:
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'ebdjangoapp-dev.us-east-1.elasticbeanstalk.com']
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'ebdjangoapp',
'storages',
)
AWS_HEADERS = { # see http://developer.yahoo.com/performance/rules.html#expires
'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
'Cache-Control': 'max-age=94608000',
}
AWS_STORAGE_BUCKET_NAME = 'ebdjangoappstaticfiles'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'secritkey'
# Tell django-storages that when coming up with the URL for an item in S3 storage, keep
# it simple - just use this domain plus the path. (If this isn't set, things get complicated).
# This controls how the `static` template tag from `staticfiles` gets expanded, if you're using it.
# We also use it in the next setting.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
# This is used by the `static` template tag from `static`, if you're using that. Or if anything else
# refers directly to STATIC_URL. So it's safest to always set it.
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
# Tell the staticfiles app to use S3Boto storage when writing the collected static files (when
# you run `collectstatic`).
STATICFILES_STORAGE = 'ebdjangoapp.custom_storages.StaticStorage'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'ebdjangoapp.custom_storages.MediaStorage'
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'ebdjango.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "ebdjangoapp/static/templates/")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'ebdjango.wsgi.application'
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
# Default Django
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_ROOT = os.path.join(BASE_DIR, "static")
I follwed this URL https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/ to let Amazon server my static and media files. It works perfectly on production. I decided to stop my production server until I fully test everything on development.
I thought these lines in my settings.py
file:
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
# ...
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
would allow my development server to look for static files in the static folder in the app directory. I did python manage.py runserver
and went to 127.0.0.1
and when I inspect element, these errors are shown:
GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/home.js
home:11 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/bootstrapCSS/css/bootstrap.min.css
home:12 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/bootstrapJS/bootstrap.min.js
home:15 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/home.css
When I try to import the CSS files I do it like this in my template:
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/home.css' %}">
What else do I have to change so that it doesn't search https://ebdjangoappstaticfiles.s3.amazonaws.com
for my static files?
django django-staticfiles
add a comment |
up vote
0
down vote
favorite
This is my settings.py
:
import os
import sys
SECRET_KEY = 'secrit'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
if RUNNING_DEVSERVER:
DEBUG = True
else:
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'ebdjangoapp-dev.us-east-1.elasticbeanstalk.com']
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'ebdjangoapp',
'storages',
)
AWS_HEADERS = { # see http://developer.yahoo.com/performance/rules.html#expires
'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
'Cache-Control': 'max-age=94608000',
}
AWS_STORAGE_BUCKET_NAME = 'ebdjangoappstaticfiles'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'secritkey'
# Tell django-storages that when coming up with the URL for an item in S3 storage, keep
# it simple - just use this domain plus the path. (If this isn't set, things get complicated).
# This controls how the `static` template tag from `staticfiles` gets expanded, if you're using it.
# We also use it in the next setting.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
# This is used by the `static` template tag from `static`, if you're using that. Or if anything else
# refers directly to STATIC_URL. So it's safest to always set it.
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
# Tell the staticfiles app to use S3Boto storage when writing the collected static files (when
# you run `collectstatic`).
STATICFILES_STORAGE = 'ebdjangoapp.custom_storages.StaticStorage'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'ebdjangoapp.custom_storages.MediaStorage'
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'ebdjango.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "ebdjangoapp/static/templates/")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'ebdjango.wsgi.application'
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
# Default Django
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_ROOT = os.path.join(BASE_DIR, "static")
I follwed this URL https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/ to let Amazon server my static and media files. It works perfectly on production. I decided to stop my production server until I fully test everything on development.
I thought these lines in my settings.py
file:
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
# ...
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
would allow my development server to look for static files in the static folder in the app directory. I did python manage.py runserver
and went to 127.0.0.1
and when I inspect element, these errors are shown:
GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/home.js
home:11 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/bootstrapCSS/css/bootstrap.min.css
home:12 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/bootstrapJS/bootstrap.min.js
home:15 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/home.css
When I try to import the CSS files I do it like this in my template:
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/home.css' %}">
What else do I have to change so that it doesn't search https://ebdjangoappstaticfiles.s3.amazonaws.com
for my static files?
django django-staticfiles
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
This is my settings.py
:
import os
import sys
SECRET_KEY = 'secrit'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
if RUNNING_DEVSERVER:
DEBUG = True
else:
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'ebdjangoapp-dev.us-east-1.elasticbeanstalk.com']
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'ebdjangoapp',
'storages',
)
AWS_HEADERS = { # see http://developer.yahoo.com/performance/rules.html#expires
'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
'Cache-Control': 'max-age=94608000',
}
AWS_STORAGE_BUCKET_NAME = 'ebdjangoappstaticfiles'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'secritkey'
# Tell django-storages that when coming up with the URL for an item in S3 storage, keep
# it simple - just use this domain plus the path. (If this isn't set, things get complicated).
# This controls how the `static` template tag from `staticfiles` gets expanded, if you're using it.
# We also use it in the next setting.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
# This is used by the `static` template tag from `static`, if you're using that. Or if anything else
# refers directly to STATIC_URL. So it's safest to always set it.
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
# Tell the staticfiles app to use S3Boto storage when writing the collected static files (when
# you run `collectstatic`).
STATICFILES_STORAGE = 'ebdjangoapp.custom_storages.StaticStorage'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'ebdjangoapp.custom_storages.MediaStorage'
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'ebdjango.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "ebdjangoapp/static/templates/")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'ebdjango.wsgi.application'
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
# Default Django
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_ROOT = os.path.join(BASE_DIR, "static")
I follwed this URL https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/ to let Amazon server my static and media files. It works perfectly on production. I decided to stop my production server until I fully test everything on development.
I thought these lines in my settings.py
file:
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
# ...
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
would allow my development server to look for static files in the static folder in the app directory. I did python manage.py runserver
and went to 127.0.0.1
and when I inspect element, these errors are shown:
GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/home.js
home:11 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/bootstrapCSS/css/bootstrap.min.css
home:12 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/bootstrapJS/bootstrap.min.js
home:15 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/home.css
When I try to import the CSS files I do it like this in my template:
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/home.css' %}">
What else do I have to change so that it doesn't search https://ebdjangoappstaticfiles.s3.amazonaws.com
for my static files?
django django-staticfiles
This is my settings.py
:
import os
import sys
SECRET_KEY = 'secrit'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
if RUNNING_DEVSERVER:
DEBUG = True
else:
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'ebdjangoapp-dev.us-east-1.elasticbeanstalk.com']
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'ebdjangoapp',
'storages',
)
AWS_HEADERS = { # see http://developer.yahoo.com/performance/rules.html#expires
'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
'Cache-Control': 'max-age=94608000',
}
AWS_STORAGE_BUCKET_NAME = 'ebdjangoappstaticfiles'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'secritkey'
# Tell django-storages that when coming up with the URL for an item in S3 storage, keep
# it simple - just use this domain plus the path. (If this isn't set, things get complicated).
# This controls how the `static` template tag from `staticfiles` gets expanded, if you're using it.
# We also use it in the next setting.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
# This is used by the `static` template tag from `static`, if you're using that. Or if anything else
# refers directly to STATIC_URL. So it's safest to always set it.
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
# Tell the staticfiles app to use S3Boto storage when writing the collected static files (when
# you run `collectstatic`).
STATICFILES_STORAGE = 'ebdjangoapp.custom_storages.StaticStorage'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'ebdjangoapp.custom_storages.MediaStorage'
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'ebdjango.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "ebdjangoapp/static/templates/")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'ebdjango.wsgi.application'
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
# Default Django
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_ROOT = os.path.join(BASE_DIR, "static")
I follwed this URL https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/ to let Amazon server my static and media files. It works perfectly on production. I decided to stop my production server until I fully test everything on development.
I thought these lines in my settings.py
file:
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
# ...
if RUNNING_DEVSERVER:
STATIC_URL = '/static/'
else:
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
would allow my development server to look for static files in the static folder in the app directory. I did python manage.py runserver
and went to 127.0.0.1
and when I inspect element, these errors are shown:
GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/home.js
home:11 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/bootstrapCSS/css/bootstrap.min.css
home:12 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/js/bootstrapJS/bootstrap.min.js
home:15 GET https://ebdjangoappstaticfiles.s3.amazonaws.com/static/css/home.css
When I try to import the CSS files I do it like this in my template:
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/home.css' %}">
What else do I have to change so that it doesn't search https://ebdjangoappstaticfiles.s3.amazonaws.com
for my static files?
django django-staticfiles
django django-staticfiles
edited Mar 19 '17 at 23:36
asked Mar 19 '17 at 23:31
user2719875
4,4261456131
4,4261456131
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
2
down vote
accepted
You're on the right track with your if
statement, however, your argv approach is very fragile. For example, you could run the same script with python manage.py runserver
or manage.py runserver
, changing the argument order and breaking your logic.
Instead, there are two more sturdy approaches you can use; The easiest it to use the DEBUG
setting to determine if you're in development or production.
if DEBUG:
# assume we're local
else:
# otherwise assume we're in production
Then you just need to make sure you set DEBUG = False
in production, which is something you should be very careful about doing anyways.
If you have multiple environments, such as a QA server, staging server and production servers, it's wise to use an environment variable and import that into your settings.
import os
# get environment variable ENV from the system
# default to prod if it doesn't exist
ENV = os.getenv('ENV', 'prod')
if ENV == 'local':
# use local settings
elif ENV == 'stage':
# use staging settings
else:
# assume we're in prod
You can then set the ENV
environment variable in each of your environments to match their role (local
, dev
, qa
, stage
, prod
, etc). This way you don't need to alter your settings files to flip variables.
One last handy trick is you can cascade your settings files by selectively importing them based on a variable.
ENV = os.getenv('ENV', 'prod')
SOME_SETTING = 'no.png'
if ENV == 'local':
import settings_local # could override SOME_SETTING
else:
import settings_prod # could also override SOME_SETTING
Okay thanks. So in my situation, how come it is still checkinghttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I haveif RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put aprint('dev')
statement inside theif
statement and verified that it does enter theif
statement).
– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easilypython mange.py runserver
vsmanage.py runserver
if you have python files automatically run. I've updated the answer with this info.
– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server withpython manage.py runserver
and if it is run in any other way,DEBUG
will always beFalse
. And since I don't run production withpython manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed anif
statement insideif RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checkshttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?
– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.
– Soviut
Mar 20 '17 at 0:14
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default toprod
.
– Soviut
Mar 20 '17 at 0:15
|
show 2 more comments
up vote
0
down vote
You are on the right path. All you need to do is to set STATICFILES_STORAGE.
if DEBUG:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_URL = "/static/"
else:
STATICFILES_STORAGE = "backend.storage_backends.StaticStorage"
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
You're on the right track with your if
statement, however, your argv approach is very fragile. For example, you could run the same script with python manage.py runserver
or manage.py runserver
, changing the argument order and breaking your logic.
Instead, there are two more sturdy approaches you can use; The easiest it to use the DEBUG
setting to determine if you're in development or production.
if DEBUG:
# assume we're local
else:
# otherwise assume we're in production
Then you just need to make sure you set DEBUG = False
in production, which is something you should be very careful about doing anyways.
If you have multiple environments, such as a QA server, staging server and production servers, it's wise to use an environment variable and import that into your settings.
import os
# get environment variable ENV from the system
# default to prod if it doesn't exist
ENV = os.getenv('ENV', 'prod')
if ENV == 'local':
# use local settings
elif ENV == 'stage':
# use staging settings
else:
# assume we're in prod
You can then set the ENV
environment variable in each of your environments to match their role (local
, dev
, qa
, stage
, prod
, etc). This way you don't need to alter your settings files to flip variables.
One last handy trick is you can cascade your settings files by selectively importing them based on a variable.
ENV = os.getenv('ENV', 'prod')
SOME_SETTING = 'no.png'
if ENV == 'local':
import settings_local # could override SOME_SETTING
else:
import settings_prod # could also override SOME_SETTING
Okay thanks. So in my situation, how come it is still checkinghttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I haveif RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put aprint('dev')
statement inside theif
statement and verified that it does enter theif
statement).
– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easilypython mange.py runserver
vsmanage.py runserver
if you have python files automatically run. I've updated the answer with this info.
– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server withpython manage.py runserver
and if it is run in any other way,DEBUG
will always beFalse
. And since I don't run production withpython manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed anif
statement insideif RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checkshttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?
– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.
– Soviut
Mar 20 '17 at 0:14
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default toprod
.
– Soviut
Mar 20 '17 at 0:15
|
show 2 more comments
up vote
2
down vote
accepted
You're on the right track with your if
statement, however, your argv approach is very fragile. For example, you could run the same script with python manage.py runserver
or manage.py runserver
, changing the argument order and breaking your logic.
Instead, there are two more sturdy approaches you can use; The easiest it to use the DEBUG
setting to determine if you're in development or production.
if DEBUG:
# assume we're local
else:
# otherwise assume we're in production
Then you just need to make sure you set DEBUG = False
in production, which is something you should be very careful about doing anyways.
If you have multiple environments, such as a QA server, staging server and production servers, it's wise to use an environment variable and import that into your settings.
import os
# get environment variable ENV from the system
# default to prod if it doesn't exist
ENV = os.getenv('ENV', 'prod')
if ENV == 'local':
# use local settings
elif ENV == 'stage':
# use staging settings
else:
# assume we're in prod
You can then set the ENV
environment variable in each of your environments to match their role (local
, dev
, qa
, stage
, prod
, etc). This way you don't need to alter your settings files to flip variables.
One last handy trick is you can cascade your settings files by selectively importing them based on a variable.
ENV = os.getenv('ENV', 'prod')
SOME_SETTING = 'no.png'
if ENV == 'local':
import settings_local # could override SOME_SETTING
else:
import settings_prod # could also override SOME_SETTING
Okay thanks. So in my situation, how come it is still checkinghttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I haveif RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put aprint('dev')
statement inside theif
statement and verified that it does enter theif
statement).
– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easilypython mange.py runserver
vsmanage.py runserver
if you have python files automatically run. I've updated the answer with this info.
– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server withpython manage.py runserver
and if it is run in any other way,DEBUG
will always beFalse
. And since I don't run production withpython manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed anif
statement insideif RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checkshttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?
– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.
– Soviut
Mar 20 '17 at 0:14
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default toprod
.
– Soviut
Mar 20 '17 at 0:15
|
show 2 more comments
up vote
2
down vote
accepted
up vote
2
down vote
accepted
You're on the right track with your if
statement, however, your argv approach is very fragile. For example, you could run the same script with python manage.py runserver
or manage.py runserver
, changing the argument order and breaking your logic.
Instead, there are two more sturdy approaches you can use; The easiest it to use the DEBUG
setting to determine if you're in development or production.
if DEBUG:
# assume we're local
else:
# otherwise assume we're in production
Then you just need to make sure you set DEBUG = False
in production, which is something you should be very careful about doing anyways.
If you have multiple environments, such as a QA server, staging server and production servers, it's wise to use an environment variable and import that into your settings.
import os
# get environment variable ENV from the system
# default to prod if it doesn't exist
ENV = os.getenv('ENV', 'prod')
if ENV == 'local':
# use local settings
elif ENV == 'stage':
# use staging settings
else:
# assume we're in prod
You can then set the ENV
environment variable in each of your environments to match their role (local
, dev
, qa
, stage
, prod
, etc). This way you don't need to alter your settings files to flip variables.
One last handy trick is you can cascade your settings files by selectively importing them based on a variable.
ENV = os.getenv('ENV', 'prod')
SOME_SETTING = 'no.png'
if ENV == 'local':
import settings_local # could override SOME_SETTING
else:
import settings_prod # could also override SOME_SETTING
You're on the right track with your if
statement, however, your argv approach is very fragile. For example, you could run the same script with python manage.py runserver
or manage.py runserver
, changing the argument order and breaking your logic.
Instead, there are two more sturdy approaches you can use; The easiest it to use the DEBUG
setting to determine if you're in development or production.
if DEBUG:
# assume we're local
else:
# otherwise assume we're in production
Then you just need to make sure you set DEBUG = False
in production, which is something you should be very careful about doing anyways.
If you have multiple environments, such as a QA server, staging server and production servers, it's wise to use an environment variable and import that into your settings.
import os
# get environment variable ENV from the system
# default to prod if it doesn't exist
ENV = os.getenv('ENV', 'prod')
if ENV == 'local':
# use local settings
elif ENV == 'stage':
# use staging settings
else:
# assume we're in prod
You can then set the ENV
environment variable in each of your environments to match their role (local
, dev
, qa
, stage
, prod
, etc). This way you don't need to alter your settings files to flip variables.
One last handy trick is you can cascade your settings files by selectively importing them based on a variable.
ENV = os.getenv('ENV', 'prod')
SOME_SETTING = 'no.png'
if ENV == 'local':
import settings_local # could override SOME_SETTING
else:
import settings_prod # could also override SOME_SETTING
edited Mar 19 '17 at 23:46
answered Mar 19 '17 at 23:39
Soviut
56.5k33142208
56.5k33142208
Okay thanks. So in my situation, how come it is still checkinghttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I haveif RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put aprint('dev')
statement inside theif
statement and verified that it does enter theif
statement).
– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easilypython mange.py runserver
vsmanage.py runserver
if you have python files automatically run. I've updated the answer with this info.
– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server withpython manage.py runserver
and if it is run in any other way,DEBUG
will always beFalse
. And since I don't run production withpython manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed anif
statement insideif RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checkshttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?
– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.
– Soviut
Mar 20 '17 at 0:14
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default toprod
.
– Soviut
Mar 20 '17 at 0:15
|
show 2 more comments
Okay thanks. So in my situation, how come it is still checkinghttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I haveif RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put aprint('dev')
statement inside theif
statement and verified that it does enter theif
statement).
– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easilypython mange.py runserver
vsmanage.py runserver
if you have python files automatically run. I've updated the answer with this info.
– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server withpython manage.py runserver
and if it is run in any other way,DEBUG
will always beFalse
. And since I don't run production withpython manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed anif
statement insideif RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checkshttps://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?
– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.
– Soviut
Mar 20 '17 at 0:14
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default toprod
.
– Soviut
Mar 20 '17 at 0:15
Okay thanks. So in my situation, how come it is still checking
https://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I have if RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put a print('dev')
statement inside the if
statement and verified that it does enter the if
statement).– user2719875
Mar 19 '17 at 23:46
Okay thanks. So in my situation, how come it is still checking
https://ebdjangoappstaticfiles.s3.amazonaws.com
for static files even though I have if RUNNING_DEVSERVER: STATIC_URL = '/static/'
(I also put a print('dev')
statement inside the if
statement and verified that it does enter the if
statement).– user2719875
Mar 19 '17 at 23:46
Your argv approach is very fragile since the arguments can change fairly easily
python mange.py runserver
vs manage.py runserver
if you have python files automatically run. I've updated the answer with this info.– Soviut
Mar 19 '17 at 23:49
Your argv approach is very fragile since the arguments can change fairly easily
python mange.py runserver
vs manage.py runserver
if you have python files automatically run. I've updated the answer with this info.– Soviut
Mar 19 '17 at 23:49
Right, but I'll always be running the dev server with
python manage.py runserver
and if it is run in any other way, DEBUG
will always be False
. And since I don't run production with python manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed an if
statement inside if RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checks https://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?– user2719875
Mar 19 '17 at 23:54
Right, but I'll always be running the dev server with
python manage.py runserver
and if it is run in any other way, DEBUG
will always be False
. And since I don't run production with python manage.py runserver
, I felt this is secure, right? But regarding the current issue, even though Django knows that I am running with dev server (or so I think, because I placed an if
statement inside if RUNNING_DEVSERVER: STATIC_URL = '/static/'
and it does get executed), it still checks https://ebdjangoappstaticfiles.s3.amazonaws.com
for static files (instead of local files). Any idea why?– user2719875
Mar 19 '17 at 23:54
It will break in all sorts of different ways, but if you insist on doing it that way,
print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.– Soviut
Mar 20 '17 at 0:14
It will break in all sorts of different ways, but if you insist on doing it that way,
print sys.argv[1]
to see what your settings file thinks the argument is. It most likely isn't picking it up correctly.– Soviut
Mar 20 '17 at 0:14
1
1
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default to
prod
.– Soviut
Mar 20 '17 at 0:15
Also, setting an environment variable is easy. It won't change how your production code runs since if the ENV variable is missing on the system it'll just default to
prod
.– Soviut
Mar 20 '17 at 0:15
|
show 2 more comments
up vote
0
down vote
You are on the right path. All you need to do is to set STATICFILES_STORAGE.
if DEBUG:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_URL = "/static/"
else:
STATICFILES_STORAGE = "backend.storage_backends.StaticStorage"
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
add a comment |
up vote
0
down vote
You are on the right path. All you need to do is to set STATICFILES_STORAGE.
if DEBUG:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_URL = "/static/"
else:
STATICFILES_STORAGE = "backend.storage_backends.StaticStorage"
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
add a comment |
up vote
0
down vote
up vote
0
down vote
You are on the right path. All you need to do is to set STATICFILES_STORAGE.
if DEBUG:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_URL = "/static/"
else:
STATICFILES_STORAGE = "backend.storage_backends.StaticStorage"
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
You are on the right path. All you need to do is to set STATICFILES_STORAGE.
if DEBUG:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_URL = "/static/"
else:
STATICFILES_STORAGE = "backend.storage_backends.StaticStorage"
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
answered Nov 11 at 3:48
m4rko
165
165
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42893656%2fhow-to-use-different-staticfiles-location-based-on-if-it-is-development-or-produ%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown