I am trying to deploy a web application to Heroku using Django. I can run the app locally just fine, but when I try to load it up live with DEBUG = False
, I get a server 500 error. If I change the settings to DEBUG = True
, it works. I would appreciate any help.
EDIT:
I found a thread that helped me get an email version of the error, which is Missing staticfiles manifest entry for 'home/css/bootswatch.css'
. So now my concern is that the static files are not configured properly but I don't know how to fix them. I am using this default django/heroku template with collectstatic
disabled - I had to do this in order to even get the app to deploy. Could this be the issue? I can't remember the exact command I had to run, but basically heroku told me it could not deploy the app until I disabled collectstatic
.
*NEW EDIT: Thanks to this thread, I realized I had to remove my disabled collectstatic config var, then try to build again. Didn't work. Error led me to realize that the default static file that comes with the starter template has to be INSIDE the settings MODULE. Did that, pushed - still didn't work. The traceback showed me that there was something wrong with my font-awesome css file. Deleted the file, added a CDN instead, pushed, and boom. Site works. I hope this is helpful to someone else in the future.
Error log
2017-10-08T19:33:03.000000+00:00 app[api]: Build started by user [email protected]
2017-10-08T19:33:19.148973+00:00 heroku[web.1]: Restarting
2017-10-08T19:33:19.149620+00:00 heroku[web.1]: State changed from up to starting
2017-10-08T19:33:19.717815+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2017-10-08T19:33:19.732436+00:00 app[web.1]: [2017-10-08 19:33:19 +0000] [4] [INFO] Handling signal: term
2017-10-08T19:33:19.732487+00:00 app[web.1]: [2017-10-08 19:33:19 +0000] [8] [INFO] Worker exiting (pid: 8)
2017-10-08T19:33:19.732716+00:00 app[web.1]: [2017-10-08 19:33:19 +0000] [9] [INFO] Worker exiting (pid: 9)
2017-10-08T19:33:19.833095+00:00 app[web.1]: [2017-10-08 19:33:19 +0000] [4] [INFO] Shutting down: Master
2017-10-08T19:33:20.012423+00:00 heroku[web.1]: Process exited with status 0
2017-10-08T19:33:18.676112+00:00 app[api]: Release v30 created by user [email protected]
2017-10-08T19:33:18.676112+00:00 app[api]: Deploy 8f625678 by user [email protected]
2017-10-08T19:33:03.000000+00:00 app[api]: Build succeeded
2017-10-08T19:33:29.936137+00:00 heroku[web.1]: Starting process with command `gunicorn portfolio.wsgi`
2017-10-08T19:33:32.419548+00:00 app[web.1]: [2017-10-08 19:33:32 +0000] [4] [INFO] Starting gunicorn 19.6.0
2017-10-08T19:33:32.420072+00:00 app[web.1]: [2017-10-08 19:33:32 +0000] [4] [INFO] Listening at: http://0.0.0.0:23534 (4)
2017-10-08T19:33:32.420207+00:00 app[web.1]: [2017-10-08 19:33:32 +0000] [4] [INFO] Using worker: sync
2017-10-08T19:33:32.424142+00:00 app[web.1]: [2017-10-08 19:33:32 +0000] [8] [INFO] Booting worker with pid: 8
2017-10-08T19:33:32.523409+00:00 app[web.1]: [2017-10-08 19:33:32 +0000] [9] [INFO] Booting worker with pid: 9
2017-10-08T19:33:33.592588+00:00 heroku[web.1]: State changed from starting to up
2017-10-08T19:33:33.991800+00:00 heroku[router]: at=info method=GET path="/" host=myproject.herokuapp.com request_id=89d87c81-0ab1-4b
2e-8705-43ef55710082 fwd="my.public.ip.address" dyno=web.1 connect=0ms service=225ms status=500 bytes=234 protocol=https
2017-10-08T19:33:36.569500+00:00 heroku[router]: at=info method=GET path="/" host=myproject.herokuapp.com request_id=cb8ea686-89ba-44
0f-8e66-0c3258c2de92 fwd="my.public.ip.address" dyno=web.1 connect=0ms service=42ms status=500 bytes=234 protocol=https
Folder structure:
__ init __.py
from .base_settings import *
from .production_settings import *
try:
from .local_settings import *
except:
pass
base_settings.py
import os, dj_database_url
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
DEBUG = ""
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
# Disable Django's own staticfiles handling in favour of WhiteNoise, for
# greater consistency between gunicorn and `./manage.py runserver`. See:
# http://whitenoise.evans.io/en/stable/django.html#using-whitenoise-in-development
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
'app ',
'app',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
'debug': DEBUG,
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Change 'default' database configuration with $DATABASE_URL.
DATABASES['default'].update(dj_database_url.config(conn_max_age=500))
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Allow all host headers
ALLOWED_HOSTS = ['myproject.herokuapp.com', 'localhost']
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = [
os.path.join(PROJECT_ROOT, 'static'),
]
# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
local_settings.py
from .base_settings import *
SECRET_KEY = 'mysecretkey'
DEBUG = True
production_settings.py
from .base_settings import *
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = False
The only problem I know of that kicks in when DEBUG = False
is the ALLOWED_HOSTS
setting. With DEBUG off Django will check your host name against the list and will reject the request if the host is not on the allowed list.
It usually results in a 400 but can give a 500 if further problems are encountered: Django allowed hosts with port number
Thanks to this thread, I realized I had to remove my disabled collectstatic config var, then try to build again. Didn't work. Error led me to realize that the default static file that comes with the starter template has to be INSIDE the settings MODULE. Did that, pushed - still didn't work. The traceback showed me that there was something wrong with my font-awesome css file. Deleted the file, added a CDN instead, pushed, and boom. Site works. I hope this is helpful to someone else in the future.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With